home *** CD-ROM | disk | FTP | other *** search
/ CD Actual 1 / PC Actual CD 01.iso / f1 / tutorc.arj / TEOC.DAT < prev    next >
Encoding:
Text File  |  1993-07-09  |  638.5 KB  |  21,553 lines

  1. ;
  2. ; TEORIA DEL LENGUAJE C
  3. ;
  4.  
  5. ; LECCION 1
  6. begin
  7. beginv
  8. borde 2
  9. color 1 7
  10. centrar_coordenadas
  11. cabecera " INTRODUCCION AL CURSO DE C "
  12. "~                                                                    ~"
  13. "~  El objetivo de este curso es enseñar el lenguaje C, o dicho de    ~"
  14. "~  otro modo, enseñar a programar en lenguaje C.                     ~"
  15. "~                                                                    ~"
  16. endv
  17. beginv
  18. centrar_coordenadas
  19. cabecera " INDICE DE ESTA LECCION "
  20. ""
  21. "En esta lección se va a estudiar los siguientes puntos:"
  22. ""
  23. "~ORIGENES~: Breve historia del lenguaje C."
  24. ""
  25. "~CARACTERISTICAS~: Algunas características importantes del lenguaje."
  26. ""
  27. "~USO~: Pasos para realizar un programa en este lenguaje."
  28. ""
  29. "~EJEMPLOS~: Tres programas para empezar a programar en C cuanto antes."
  30. ""
  31. endv
  32. borrar_pantalla
  33. beginv
  34. coordenadas 2 3
  35. color 15 2
  36. cabecera " ORIGENES DEL C "
  37. "El lenguaje C fue inventado por ~Dennis Ritchie~ en"
  38. "1972 cuando trabajaba, junto con Ken Thompson, en"
  39. "el diseño del sistema operativo UNIX."
  40. endv
  41. beginv
  42. coordenadas 2 10
  43. borde 1
  44. "El lenguaje C deriva del lenguaje B de Thompson, el cual, a su"
  45. "vez, deriva del lenguaje BCPL desarrollado por Martin Richards."
  46. endv
  47. beginv
  48. coordenadas 2 16
  49. "Durante muchos años el estándar de C fue la versión proporcionada con el"
  50. "sistema operativo UNIX versión 5. Pero pronto empezaron a surgir muchas"
  51. "implementaciones del C a raíz de la popularidad creciente de los microor-"
  52. "denadores. Por este motivo, se hizo necesario definir un C estándar que"
  53. "está representado hoy por el ~ANSI C~."
  54. endv
  55. borrar_pantalla
  56. beginv
  57. centrar_coordenadas
  58. color 15 3
  59. borde 2
  60. no_sombra
  61. "En este tutor se va a estudiar el ~C estándar~. No obstante, si la opción"
  62. "turbo está activada, también se incluirá en la explicación la versión"
  63. "Turbo C de Borland International, que es uno de los mejores compiladores"
  64. "de C que existen en el mercado."
  65. endv
  66. begint
  67. beginv
  68. centrar_coordenadas
  69. no_sombra
  70. "Esta ventana la estás viendo porque la opción turbo"
  71. "está activada, sino no la verías."
  72. ""
  73. pulsación
  74. "Cuando nos referimos a Turbo C, estamos hablando"
  75. "indistintamente de las distintas versiones que"
  76. "existen sobre los paquetes ~Turbo C~, ~Turbo C++~ y"
  77. "~Borland C++~, puesto que en todos ellos se puede"
  78. "programar en C."
  79. ""
  80. pulsación
  81. "El lenguaje C suministrado por Turbo C es, simple-"
  82. "mente, una ampliación del ANSI C, sobre todo en el"
  83. "número de funciones de librería suministradas."
  84. endv
  85. endt
  86. borrar_pantalla
  87. beginv
  88. coordenadas 1 2
  89. color 15 1
  90. borde 2
  91. cabecera " CARACTERISTICAS DEL LENGUAJE C "
  92. ""
  93. "Algunas características del lenguaje C son las siguientes:"
  94. ""
  95. pulsación
  96. "- Es un ~lenguaje de propósito general~. Este lenguaje se ha utilizado para"
  97. "  el desarrollo de aplicaciones tan dispares como: hojas de cálculos,"
  98. "  gestores de bases de datos, compiladores, sistemas operativos, ..."
  99. ""
  100. pulsación
  101. "- Es un ~lenguaje de medio nivel~. Este lenguaje permite programar a alto"
  102. "  nivel (pensando a nivel lógico y no en la máquina física) y a bajo"
  103. "  nivel (con lo que se puede obtener la máxima eficiencia y un control"
  104. "  absoluto de cuanto sucede en el interior del ordenador)."
  105. ""
  106. pulsación
  107. "- Es un ~lenguaje portátil~. Los programas escritos en C son fácilmente"
  108. "  transportables a otros sistemas."
  109. ""
  110. pulsación
  111. "- Es un ~lenguaje potente y eficiente~. Usando C, un programador puede casi"
  112. "  alcanzar la eficiencia del código ensamblador junto con la estructura del "
  113. "  Algol o Pascal."
  114. ""
  115. endv
  116. beginv
  117. coordenadas 2 20
  118. color 7 9
  119. borde 1
  120. "Como desventajas habría que reseñar que es más complicado de aprender que "
  121. "otros lenguajes como Pascal o Basic y que requiere una cierta experiencia"
  122. "para poder aprovecharlo a fondo."
  123. endv
  124. borrar_pantalla
  125. beginv
  126. coordenadas 2 3
  127. color 14 3
  128. borde 2
  129. cabecera " USO DEL C "
  130. ""
  131. "Los pasos a seguir desde el momento que"
  132. "se comienza a escribir el programa C"
  133. "hasta que se ejecuta son los siguientes:"
  134. ""
  135. pulsación
  136. "    ~1.- Escribirlo en un editor.~"
  137. ""
  138. pulsación
  139. "    ~2.- Compilarlo en un compilador.~"
  140. ""
  141. pulsación
  142. "    ~3.- Enlazarlo en un enlazador.~"
  143. ""
  144. pulsación
  145. "    ~4.- Ejecutarlo.~"
  146. ""
  147. endv
  148. beginv
  149. borde 1
  150. cabecera " Paso 1: ESCRIBIRLO "
  151. coordenadas 4 5
  152. color 14 5
  153. "El programa se puede escribir en cualquier editor que genere"
  154. "ficheros de texto estándar, esto es, que los ficheros generados"
  155. "no incluyan códigos de control y caracteres no imprimibles."
  156. ""
  157. pulsación
  158. "Estos ficheros que contienen código C se llaman ~ficheros fuentes~."
  159. "Los ficheros fuentes son aquellos que contienen código fuente,"
  160. "es decir, ficheros con texto que el usuario puede leer y que son"
  161. "utilizados como entrada al compilador de C."
  162. ""
  163. pulsación
  164. "Los programas pequeños suelen ocupar un solo fichero fuente;"
  165. "pero a medida que el programa crece, se va haciendo necesario"
  166. "distribuirlo en más ficheos fuentes."
  167. endv
  168. beginv
  169. cabecera " Paso 2: COMPILARLO "
  170. coordenadas 6 6
  171. color 14 3
  172. ""
  173. "El compilador produce ~ficheros objetos~ a partir de los ficheros "
  174. "fuentes. Los ficheros objetos son los ficheros que contienen"
  175. "código objeto, es decir, ficheros con código máquina (número"
  176. "binarios que tiene significado para el microprocesador) y que"
  177. "son utilizados como entrada al enlazador."
  178. ""
  179. pulsación
  180. "La extensión de estos ficheros es OBJ, aunque también los hay"
  181. "con extensión LIB. A estos últimos se les llama también ~ficheros~"
  182. "~de librería o biblioteca~; contienen código máquina perteneciente"
  183. "a código compilado suministrado por el compilador."
  184. ""
  185. endv
  186. beginv
  187. cabecera " Paso 3: ENLAZARLO "
  188. coordenadas 8 7
  189. color 14 5
  190. ""
  191. "El enlazador produce un ~fichero ejecutable~ a partir de los"
  192. "ficheros objetos."
  193. ""
  194. pulsación
  195. "Los ficheros ejecutables son aquellos que contienen código"
  196. "máquina y se pueden ejecutar directamente por el sistema"
  197. "operativo."
  198. ""
  199. pulsación
  200. "La extensión estos ficheros es EXE o COM."
  201. ""
  202. pulsación
  203. "Al proceso de enlazado también se le suele llamar el proceso de"
  204. "linkado."
  205. ""
  206. endv
  207. beginv
  208. cabecera " Paso 4: EJECUTARLO "
  209. coordenadas 10 8
  210. color 14 3
  211. ""
  212. "El programa se puede ejecutar simplemente tecleando su nombre "
  213. "desde la línea de comandos del sistema operativo."
  214. ""
  215. endv
  216. beginv
  217. cabecera " ESQUEMA "
  218. coordenadas 1 2
  219. "          Los pasos anteriores se resumen en el siguiente esquema:"
  220. ""
  221. "            f1.c  ---->  f1.obj  ---------|"
  222. "                                          |"
  223. "            f2.c  ---->  f2.obj  ---------|"
  224. "                                          |"
  225. "             .             .              |"
  226. "             .             .              |"
  227. "             .             .              |"
  228. "                                          |"
  229. "            fn.c  ---->  fn.obj  ---------|"
  230. "                                          | --------------> f.exe           "
  231. "                         f1.lib  ---------|"
  232. "                                          |"
  233. "                         f2.lib  ---------|"
  234. "                                          |"
  235. "                           .              |"
  236. "                           .              |"
  237. "                           .              |"
  238. "                                          |"
  239. "                         fm.lib  ---------|"
  240. endv
  241. beginv
  242. borde 2
  243. centrar_coordenadas
  244. color 14 5
  245. ""
  246. "Hoy día los compiladores de C son muy sofisticados e incluyen"
  247. "~entornos integrados~ desde los cuales editamos, compilamos,"
  248. "enlazamos, y podemos realizar una multitud de servicios más."
  249. ""
  250. pulsación
  251. "En algunos de ellos se pueden realizar los pasos de compilado,"
  252. "enlazado y ejecutado con la pulsación de una sola tecla."
  253. ""
  254. endv
  255. begint
  256. beginv
  257. centrar_coordenadas
  258. "En Turbo C tenemos las siguientes"
  259. "teclas relacionadas con este tema:"
  260. ""
  261. "  ~ALT-F9~: Compilar a OBJ."
  262. ""
  263. "  ~F9~: Hacer fichero EXE."
  264. ""
  265. "  ~CTRL-F9~: Ejecutar."
  266. ""
  267. "Se puede pulsar directamente CTRL-F9"
  268. "para compilar, enlazar y ejecutar."
  269. endv
  270. endt
  271. borrar_pantalla
  272. partir
  273. beginv
  274. centrar_coordenadas
  275. color 15 0
  276. borde 0
  277. no_sombra
  278. ""
  279. "En programación, la experiencia es el gran maestro. Por ello"
  280. "es conveniente empezar a hacer programas en C cuanto antes."
  281. ""
  282. pulsación
  283. "A continuación se van a presentar varios programas completos"
  284. "en C muy sencillos para ir familiarizóndonos en la programación"
  285. "de este lenguaje."
  286. ""
  287. endv
  288. borrar_pantalla
  289. beginv
  290. color 15 1
  291. borde 2
  292. no_sombra
  293. centrar_coordenadas_x 2
  294. cabecera " NUESTRO PRIMER PROGRAMA C "
  295. "#include <stdio.h>"
  296. ""
  297. "main ()"
  298. "{"
  299. "  printf ("Mi primer programa en C.");"
  300. "}"
  301. endv
  302. beginvis
  303. color 15 1
  304. coordenadas_completas 1 11 80 24
  305. borde 1
  306. "La salida de este programa por pantalla es:"
  307. ""
  308. "~Mi primer programa en C.~"
  309. ""
  310. ""
  311. "Analicemos a continuación nuestro primer programa."
  312. ""
  313. "Los programas C están compuestos de unidades de programa llamadas ~funciones~,"
  314. "las cuales son los módulos básicos del programa."
  315. ""
  316. "En este caso, el programa está compuesto por una sola función llamada ~main~."
  317. ""
  318. "Todos los programas C deben tener una función main (en español significa"
  319. "principal) pues es la primera función que se ejecuta cuando se hace fun-"
  320. "cionar el programa."
  321. ""
  322. "Los ~paréntesis~ que siguen a main identifican a ésta como nombre de función."
  323. ""
  324. "Un método de comunicación de datos entre funciones es el uso de ~argumentos~."
  325. "Los argumentos son los datos que se les pasa a las funciones. Estos se"
  326. "encierran entre paréntesis; main es una función sin argumentos, lo que se"
  327. "indica mediante ()."
  328. ""
  329. "La línea con:"
  330. ""
  331. "  printf ("Mi primer programa en C.");"
  332. ""
  333. "realiza una ~llamada a una función~ denominada ~printf~, con el argumento"
  334. ""Mi primer programa en C."; printf es una función de biblioteca que realiza"
  335. "una escritura en la salida estándar. Normalmente la salida estándar es el"
  336. "monitor."
  337. ""
  338. "La función printf escribe concretamente una ~cadena~ (conocido también con los"
  339. "nombres de cadena de caracteres, constante de caracteres y string)."
  340. ""
  341. "~Una cadena es una secuencia de caracteres.~"
  342. ""
  343. "~Cada instrucción en C termina con un punto y coma.~ La línea del main () no"
  344. "va seguida de punto y coma porque no se trata de una llamada a una función"
  345. "sino de la ~definición de una función~. La definición de una función especi-"
  346. "fica las instrucciones que posee dicha función asi como los argumentos que"
  347. "tiene."
  348. ""
  349. "printf es una función de librería que está definida en el fichero ~stdio.h~"
  350. "(standard input/output header). Las funciones de librería son aquellas"
  351. "suministradas por el compilador y que están a nuestra disposición. Para"
  352. "utilizar una función de librería es necesario incluir el correspondiente"
  353. "fichero de cabecera antes de utilizarla."
  354. ""
  355. "Cada fichero de librería incluye muchas funciones. Por ejemplo, ~la librería~"
  356. "~stdio.h define funciones de entrada y salida estándar~. Pero en el fichero"
  357. "ejecutable de nuestro programa sólo están las funciones de librería que"
  358. "hemos utilizado. De esta forma el tamaño del código ejecutable se reduce"
  359. "al mínimo."
  360. ""
  361. "La función"
  362. ""
  363. "  main ()"
  364. "  {"
  365. "    printf ("Mi primer programa en C.");"
  366. "  }"
  367. ""
  368. "también se podía haber escrito así:"
  369. ""
  370. "  main(){printf("Mi primer programa en C.");}"
  371. ""
  372. "pero en este caso el código es menos legible para el usuario."
  373. ""
  374. "~El C es sensintivo al caso~. Esto significa que las letras mayúsculas son"
  375. "distintas a las minúsculas. De este modo, no es lo mismo para el C printf"
  376. "que PRINTF o que Printf."
  377. ""
  378. "Todas las líneas que empiezan con ~#~ no son en realidad instrucciones del"
  379. "lenguaje C sino que son líneas para ser manipuladas por el ~preprocesador~. El"
  380. "preprocesador realiza algunas tareas antes de empezar a actuar el compilador."
  381. ""
  382. "La línea"
  383. ""
  384. "  #include <stdio.h>"
  385. ""
  386. "lo que hace es ~incluir~ la información que hay en el fichero stdio.h en"
  387. "nuestro programa."
  388. ""
  389. "En el fichero stdio.h se encuentra la definición de la función printf. Si no"
  390. "se pusiera este include en nuestro programa, el compilador no sabría cómo es"
  391. "la función printf y daría error."
  392. ""
  393. "~Resumen del análisis del programa:~"
  394. ""
  395. "~Nuestro programa está compuesto de una sola función: la función main. Esta  ~"
  396. "~función siempre debe aparecer en los programas C pues es la primera función ~"
  397. "~que se ejecuta. La función main en este caso no tiene argumentos.           ~"
  398. "~                                                                            ~"
  399. "~Esta función está compuesta de una sola instrucción: llamada a la función   ~"
  400. "~printf para que escriba una cadena en pantalla.                             ~"
  401. "~                                                                            ~"
  402. "~La definición de la función printf está en el fichero stdio.h. Por lo tanto,~"
  403. "~hay que incluir (con #include) este fichero para poder utilizar la función  ~"
  404. "~printf.                                                                     ~"
  405. endvis
  406. borrar_pantalla
  407. beginv
  408. color 15 3
  409. centrar_coordenadas
  410. borde 2
  411. "Veamos ahora un segundo ejemplo algo más complicado que el anterior."
  412. endv
  413. borrar_pantalla
  414. beginv
  415. color 15 1
  416. borde 2
  417. no_sombra
  418. centrar_coordenadas_x 2
  419. cabecera " NUESTRO SEGUNDO PROGRAMA C "
  420. "#include <stdio.h>"
  421. ""
  422. "main ()"
  423. "{"
  424. "  printf ("Mi segundo programa en C.\n");"
  425. "  printf ("Pulsa la tecla RETURN para terminar.");"
  426. "  getchar ();"
  427. "}"
  428. endv
  429. beginvis
  430. coordenadas_completas 1 13 80 24
  431. color 15 1
  432. borde 1
  433. "La salida por pantalla de este programa es:"
  434. ""
  435. "~Mi segundo programa en C.~"
  436. "~Pulsa la tecla RETURN para terminar.~"
  437. ""
  438. ""
  439. "Analicemos a continuación nuestro segundo programa."
  440. ""
  441. "Hay dos novedades con respecto al primer ejemplo: la primera es la aparición"
  442. "del código \n dentro de la cadena del primer printf. La segunda es la apari-"
  443. "ción de una nueva función de librería: getchar ()."
  444. ""
  445. "En C, todo lo que va entre comillas es una cadena. Ya dijimos antes que una"
  446. "cadena es una secuencia de caracteres. La secuencia ~\n~ es un carácter espe-"
  447. "cial que denota el carácter de nueva línea. Al ser \n un carácter se puede"
  448. "incluir en cualquier parte de una cadena como cualquier otra carácter. En"
  449. "nuestro programa, si no se hubiese incluido, la salida habría sido:"
  450. ""
  451. "~Mi segundo programa en C. Pulsa la tecla RETURN para terminar.~"
  452. ""
  453. "A continuación se van a mostrar tres programas equivalentes al del ejemplo."
  454. ""
  455. "~#include <stdio.h>                                  ~"
  456. "~                                                    ~"
  457. "~main ()                                             ~"
  458. "~{                                                   ~"
  459. "~  printf ("Mi segundo programa en C.");             ~"
  460. "~  printf ("\nPulsa la tecla RETURN para terminar.");~"
  461. "~  getchar ();                                       ~"
  462. "~}                                                   ~"
  463. ""
  464. "~#include <stdio.h>                                                          ~"
  465. "~                                                                            ~"
  466. "~main ()                                                                     ~"
  467. "~{                                                                           ~"
  468. "~  printf("Mi segundo programa en C.\nPulsa la tecla RETURN para terminar.");~"
  469. "~  getchar();                                                                ~"
  470. "~}                                                                           ~"
  471. ""
  472. "~#include <stdio.h>                                ~"
  473. "~                                                  ~"
  474. "~main ()                                           ~"
  475. "~{                                                 ~"
  476. "~  printf ("Mi segundo programa en C.");           ~"
  477. "~  printf ("\n");                                  ~"
  478. "~  printf ("Pulsa la tecla RETURN para terminar.");~"
  479. "~  getchar ();                                     ~"
  480. "~}                                                 ~"
  481. ""
  482. "A todos los caracteres empezados por ~\~ se les llaman ~secuencias de escape~."
  483. ""
  484. "Las secuencias de escape son mecanismos para representar caracteres no"
  485. "imprimibles."
  486. ""
  487. "Antes vimos la secuencia de escape ~\n~ que representaba a la nueva línea."
  488. ""
  489. "Otras secuencias de escape son ~\r~ para el retorno de carro, ~\t~ para el"
  490. "tabulador, ~\b~ para retroceso, ~\"~ para la comilla, ~\'~ para el apóstrofe"
  491. "y ~\\~ para la barra diagonal invertida."
  492. ""
  493. "Si nuestro primer programa lo ejecutamos desde un entorno integrado, en"
  494. "muchos de estos entornos, a la finalización de la ejecución de nuestro"
  495. "programa C, la frase impresa desaparece inmediatamente y se vuelve a la"
  496. "pantalla del entorno."
  497. ""
  498. "Todos estos entornos poseen mecanismos para visualizar la pantalla de"
  499. "ejecución."
  500. ""
  501. begint
  502. "En Turbo C, pulsando ~ALT-F5~ se puede ver la pantalla de ejecución."
  503. ""
  504. endt
  505. "Una solución alternativa es incluir la función getchar () al final de la"
  506. "función main ()."
  507. ""
  508. "~getchar () es una función que espera la pulsación de la tecla return~ por"
  509. "parte del usuario."
  510. ""
  511. "Esta función no necesita argumentos pero los paréntesis son necesarios"
  512. "puesto que se trata de una función."
  513. ""
  514. "getchar () se encuentra en la librería stdio.h, por lo tanto, siempre que"
  515. "utilicemos esta función en un programa es necesario incluir la línea:"
  516. ""
  517. "  #include <stdio.h>"
  518. endvis
  519. borrar_pantalla
  520. beginv
  521. color 15 3
  522. centrar_coordenadas
  523. borde 2
  524. "Veamos nuestro último programa ejemplo de esta lección."
  525. endv
  526. borrar_pantalla
  527. beginv
  528. color 15 1
  529. borde 2
  530. no_sombra
  531. centrar_coordenadas_x 2
  532. cabecera " NUESTRO TERCER PROGRAMA C "
  533. "#include <stdio.h>"
  534. "main () /* Tercer ejemplo */"
  535. "{"
  536. "  int horas, minutos;"
  537. "  horas = 3;"
  538. "  minutos = 60 * horas;"
  539. "  printf ("Hay %d minutos en %d horas.", minutos, horas);"
  540. "  getchar ();"
  541. "}"
  542. endv
  543. beginvis
  544. coordenadas_completas 1 14 80 24
  545. color 15 1
  546. borde 1
  547. "La salida por pantalla de este programa es:"
  548. ""
  549. "~Hay 180 minutos en 3 horas.~"
  550. ""
  551. ""
  552. "Analicemos a continuación nuestro tercer programa."
  553. ""
  554. "En C, todo aquello que vaya entre un ~/*~ y un ~*/~ es ignorado. Las secuencias"
  555. "/* y */ denotan el principio y el final de un comentario en C. Se deben"
  556. "utilizar comentarios en los programas para hacerlos más comprensibles."
  557. ""
  558. "La línea:"
  559. ""
  560. "  int horas, minutos;"
  561. ""
  562. "es una ~sentencia de declaración~."
  563. ""
  564. "En este caso se declaran dos cosas:"
  565. ""
  566. "~1) En algún sitio de la función se utilizarán las "variables" hora y minutos.~"
  567. ""
  568. "~2) Estas dos variables son de tipo entero (integer).~"
  569. ""
  570. "El punto y coma final de la línea de declaración la identifican como una"
  571. "sentencia o instrucción C."
  572. ""
  573. "También se podría haber escrito:"
  574. ""
  575. "~int horas;~"
  576. "~int minutos;~"
  577. ""
  578. "Las ~variables~ son posiciones de memoria donde el valor de su contenido puede"
  579. "variar a lo largo del programa."
  580. ""
  581. "Nos la podemos imaginar como cajas donde podemos meter cualquier cosa que le"
  582. "venga bien a la caja."
  583. ""
  584. "En C, todas las variables utilizadas ha de ser declaradas antes de su uso."
  585. "Las líneas"
  586. ""
  587. "  horas = 3;"
  588. "  minutos = 60 * horas;"
  589. ""
  590. "son ~sentencias de asignación~."
  591. ""
  592. "La primera línea significa: "dar a la variable horas el valor 3". La segunda"
  593. "línea significa: "dar a la variable minutos el resultado de multiplicar 60"
  594. "por horas". Nótese que las dos líneas terminan en punto y coma por ser dos"
  595. "sentencias o instrucciones."
  596. ""
  597. "En la línea"
  598. ""
  599. "  ~int horas, minutos;~"
  600. ""
  601. "se reserva espacio en memoria a las variables horas y minutos."
  602. ""
  603. "En las líneas"
  604. ""
  605. "  ~hora = 3;~"
  606. "  ~minutos = 60 * horas;~"
  607. ""
  608. "se les da valor a dichas variables (al contenido de los espacios reservados)."
  609. "Posteriormente se les puede asignar a estas variables valores diferentes."
  610. "~=~ es el operador de asignación y ~*~ es el operador de multiplicación."
  611. ""
  612. "Otros operadores son: ~+~ (número positivo usado como operador unario y suma"
  613. "usado como operador binario), ~-~ (número negativo usado como operador unario"
  614. "y substracción usado como operador binario), ~/~ (operador de división), ~%~"
  615. "(operador módulo, esto es, resto de la división de dos números enteros)."
  616. ""
  617. "En este momento, se mencionan estos operadores para empezar a hacer pequeños"
  618. "programas. En lecciones ulteriores se verán en detalle todos los operadores."
  619. ""
  620. "La línea"
  621. ""
  622. "  printf ("Hay %d minutos en %d horas.", minutos, horas);"
  623. ""
  624. "escribe:"
  625. ""
  626. "~Hay 180 minutos en 2 horas.~"
  627. ""
  628. "Como se ve los dos %d no se han escrito y sin embargo se ha escrito en su"
  629. "lugar los valores de las variables minutos y horas."
  630. ""
  631. "El símbolo ~%~ avisa a la función printf que se va a imprimir una variable"
  632. "en esta posición; la letra ~d~ informa que la variable a imprimir es entera"
  633. "(digit)."
  634. ""
  635. "printf significa escritura (print) con formato (format) porque nos permite"
  636. "formatear la salida a nuestro gusto."
  637. ""
  638. "La estructura de toda función C es:"
  639. ""
  640. "  ~{                         ~"
  641. "  ~  declaración_de_variables~"
  642. "  ~  sentencias              ~"
  643. "  ~}                         ~"
  644. ""
  645. "donde declaración_de_variables es una lista del tipo:"
  646. ""
  647. "  ~tipo lista_de_variables;~"
  648. ""
  649. "y lista_de_variables es uno o más nombres de variables separados por comas."
  650. ""
  651. "~RECUERDA: La declaración de variables ha de ir al principio de la función,~"
  652. "~antes de la primera sentencia ejecutable.~"
  653. endvis
  654. borrar_pantalla
  655. beginv
  656. borde 2
  657. centrar_coordenadas
  658. color 3 4
  659. ""
  660. "Si no has entendido algo en los tres ejemplos vistos,"
  661. "no te preocupes, pues todo lo que hay ellos se va a"
  662. "estudiar en profundidad en lecciones posteriores."
  663. ""
  664. pulsación
  665. "Con estos ejemplos lo que se ha pretendido es empezar"
  666. "a hacer programas completos en C desde un primer"
  667. "momento, intentando ofrecer una visión global de éste."
  668. ""
  669. endv
  670. end lección 1
  671.  
  672. ; LECCION 2
  673. begin
  674. beginv
  675. borde 2
  676. color 1 7
  677. centrar_coordenadas
  678. cabecera " INTRODUCCION A LA LECCION 2 "
  679. "~                                                                     ~"
  680. "~ En esta lección vamos a hacer un estudio completo sobre lo tipos,   ~"
  681. "~ operadores y expresiones del lenguaje C. Además profundizaremos un  ~"
  682. "~ poco más en el estudio de la función printf a medida que vaya siendo~"
  683. "~ necesario.                                                          ~"
  684. "~                                                                     ~"
  685. ""
  686. pulsación
  687. "A modo de introducción vamos a dar unas definiciones muy breves que"
  688. "serán ampliadas a lo largo de toda la lección:"
  689. ""
  690. "- Las variables y constantes son los objetos básicos que se manipulan"
  691. "  en un programa."
  692. "- Las declaraciones indican las variables que se van a utilizar y"
  693. "  establecen su tipo y, quizá, su valor inicial."
  694. "- Los operadores especifican lo que se va a hacer con ellas."
  695. "- Las expresiones combinan variables y constantes para producir"
  696. "  nuevos valores."
  697. ""
  698. endv
  699. borrar_pantalla
  700. beginv
  701. color 15 4
  702. borde 2
  703. cabecera " DATOS "
  704. centrar_coordenadas_x 2
  705. ""
  706. " Los programas funcionan con datos. "
  707. ""
  708. endv
  709. beginv
  710. coordenadas 4 8
  711. borde 1
  712. color 7 4
  713. "Los ~datos~ son los números y"
  714. "los caracteres que contienen la"
  715. "información a utilizar."
  716. endv
  717. beginv
  718. coordenadas 43 8
  719. "Una primera división de los    "
  720. "datos la podemos hacer en"
  721. "constantes y variables."
  722. endv
  723. beginv
  724. coordenadas 4 14
  725. "Las ~constantes~ son datos con"
  726. "valores fijos que no pueden ser"
  727. "alterados por el programa."
  728. endv
  729. beginv
  730. coordenadas 43 14
  731. "Las ~variables~ son datos cuyo"
  732. "valor se puede cambiar a lo    "
  733. "largo del programa."
  734. endv
  735. beginv
  736. centrar_coordenadas_x 20
  737. "Una segunda división de los datos la podemos"
  738. "hacer según los tipos de que sean."
  739. endv
  740. beginv
  741. color 14 1
  742. borde 2
  743. centrar_coordenadas
  744. cabecera " TIPOS DE DATOS "
  745. ""
  746. "Existen cinco tipos de datos básicos en C:"
  747. ""
  748. "Tipo   Descripción        Longitud en bytes Rango"
  749. "------ ------------------ ----------------- -------------------------------"
  750. "~char  ~ carácter                    1        0 a 255"
  751. "~int   ~ entero                      2        -32768 a 32767"
  752. "~float ~ coma flotante               4        aproxim. 6 dígitos de precisión"
  753. "~double~ coma flotante"
  754. "       de doble precisión          8        aproxim. 12 dígitos de precisión"
  755. "~void  ~ sin valor                   0        sin valor"
  756. ""
  757. "NOTA IMPORTANTE: La longitud en bytes, y por consiguiente, también el rango,"
  758. "de la tabla anterior, dependen de cada tipo de procesador y de cada compila-"
  759. "dor de C. No obstante, la información reseñada en la tabla es correcta para"
  760. "la mayoría de los ordenadores."
  761. ""
  762. endv
  763. beginvis
  764. coordenadas_completas 1 2 80 24
  765. color 15 1
  766. cabecera " TIPO CARACTER "
  767. borde 2
  768. "~En C, los caracteres se definen con apóstrofos.~"
  769. ""
  770. "Ejemplos válidos de constantes tipo carácter: 'T', 'l', '1'."
  771. "Ejemplos inválidos de constantes tipo carácter: 'TT', l, 1."
  772. ""
  773. "'TT' es incorrecto porque hay dos caracteres entre los apóstrofos; l es"
  774. "incorrecto porque el compilador lo interpreta como una variable; el 1 lo"
  775. "interpreta el compilador como un número y no como un carácter."
  776. ""
  777. "~El valor de una constante carácter es el valor numérico del carácter en el~"
  778. "~conjunto de caracteres del sistema~. Por ejemplo, en el conjunto ASCII, el"
  779. "carácter cero, o '0', es 48, y en EBCDIC '0' es 240, ambos muy diferentes"
  780. "del valor numérico 0."
  781. ""
  782. "A lo largo de este tutor se utilizará el código ASCII y no el EBCDIC a fin"
  783. "de utilizar ejemplos concretos."
  784. ""
  785. "Ejemplos de asignación de este tipo de datos:"
  786. ""
  787. "  char ch1, ch2; /* declaración de las variables ch1 y ch2 */"
  788. "  ch1 = 'A'; /* a la variable ch1 se le asigna el valor ascii de 'A': 65 */"
  789. "  ch2 = 65; /*a la variable ch2 se le asigna el código ASCII 65 que es 'A'*/"
  790. ""
  791. "Las dos asignaciones anteriores son equivalentes pero es preferible la"
  792. "primera asignación porque es más portátil. A ch1 se le asigna en cualquier"
  793. "ordenador el carácter 'A'. Sin embargo, a la variable ch2, en sistemas"
  794. "basados en código ASCII se le asigna el carácter 'A' (el código ASCII de"
  795. "65 es 'A'), y en sistemas basados en código EBCDIC se le asigna un carácter"
  796. "distinto a 'A'."
  797. ""
  798. "~Todas las variables en C han de ser declaradas antes de poder ser usadas.~"
  799. ""
  800. "~La forma general de declaración es la siguiente:~"
  801. "~  tipo lista_variables;                         ~"
  802. ""
  803. "Aquí, tipo debe ser un tipo de datos válido de C y lista_variables puede"
  804. "consistir en uno o más nombres de identificadores separados por comas."
  805. "Las declaraciones deben estar antes de la primera sentencia ejecutable."
  806. ""
  807. "Ejemplos de declaraciones:"
  808. ""
  809. "  int i, j, k;"
  810. "  char caracter;"
  811. ""
  812. "Los identificadores en C son los nombres usados para referenciar las"
  813. "variables, las funciones y otros objetos definidos por el usuario. Los"
  814. "nombres de los identificadores están compuestos por letras, dígitos y"
  815. "el carácter de subrayado (_). El número de caracteres significativos de"
  816. "los identificadores depende del compilador. El primer carácter de un"
  817. "identificador ha de ser letra o el carácter de subrayado."
  818. begint
  819. ""
  820. "En Turbo C, el número de caracteres significativos por defecto es 32."
  821. endt
  822. ""
  823. "Ciertos caracteres no imprimibles se representan como constantes de"
  824. "carácter mediante secuencias de escape."
  825. ""
  826. "En la siguiente tabla se muestran las secuencias de escape del ANSI C:"
  827. ""
  828. "       Código   Significado"
  829. "       ------   ---------------------------------------------------------"
  830. "       ~\b~     retroceso"
  831. "       ~\f~     salto de página"
  832. "       ~\n~     nueva línea"
  833. "       ~\r~     retorno de carro"
  834. "       ~\t~     tabulación horizontal"
  835. "       ~\"~     comillas (")"
  836. "       ~\'~     apóstrofo (')"
  837. "       ~\0~     carácter nulo"
  838. "       ~\\~     barra invertida (\)"
  839. "       ~\v~     tabulación vertical"
  840. "       ~\a~     alerta (bell, campanilla)"
  841. "       ~\ddd~   constante octal (ddd son tres dígitos como máximo)"
  842. "       ~\xddd~  constante hexadecimal (ddd son tres dígitos como máximo)"
  843. ""
  844. ""
  845. "Hay otros caracteres no imprimibles que no tienen correspondencia en la"
  846. "tabla anterior. Estos caracteres se pueden utilizar mediante los códigos"
  847. "\ddd, \xddd o simplemente usando el número del código ASCII."
  848. ""
  849. "Ejemplo de asignaciones equivalentes:"
  850. ""
  851. "  char ch1, ch2, ch3, ch4; /*declaración de cuatro variables tipo carácter*/"
  852. "  ch1 = '\n';   /* el carácter '\n' es el número 13 en ASCII */"
  853. "  ch2 = 13;     /* 13 decimal <=> 12 octal <=> A hexadecimal */"
  854. "  ch3 = '\12'; /* también sería válido: ch3 = '\012'; */"
  855. "  ch4 = '\xA';  /* también sería válido: ch4 = '\xa'; */"
  856. ""
  857. "La notación preferida es la primera. Aunque para los caracteres no"
  858. "imprimibles que no tienen correspondencia en la tabla anterior, la"
  859. "única solución es una una de las tres últimas asignaciones del ejemplo."
  860. endvis
  861. beginvis
  862. coordenadas_completas 1 2 80 24
  863. color 15 1
  864. cabecera " TIPO ENTERO "
  865. borde 2
  866. ""
  867. "~Es un número sin parte fraccionaria.~"
  868. ""
  869. "Las constantes enteras se pueden escribir de uno de los tres modos"
  870. "siguientes:"
  871. ""
  872. "  - En decimal: escribiendo el número sin empezar por 0 (a excepción de que"
  873. "    sea el propio 0). Ejemplos: 1, 0, -2."
  874. ""
  875. "  - En hexadecimal: empezando el número por 0x. Ejemplos: 0xE, 0x1d, 0x8."
  876. ""
  877. "  - En octal: empezando el número por 0. Ejemplos: 02, 010."
  878. endvis
  879. beginvis
  880. coordenadas_completas 1 2 80 24
  881. color 15 1
  882. cabecera " TIPOS FLOAT Y DOUBLE "
  883. borde 2
  884. "~Las constantes de este tipo tienen parte real y parte fraccionaria.~"
  885. ""
  886. "El tipo double tiene doble precisión que el tipo float. Por lo demás,"
  887. "los dos tipos son iguales."
  888. ""
  889. "La sintaxis correcta de las constantes de estos dos tipos es:"
  890. ""
  891. " ~[signo] [dígitos] [.] [dígitos] [exponente [signo] dígitos]~"
  892. ""
  893. "donde"
  894. ""
  895. "  signo es + o -;"
  896. "  dígitos es una secuencia de dígitos;"
  897. "  . es el punto decimal;"
  898. "  exponente es E o e."
  899. ""
  900. "Los elementos que están entre [] son opcionales, pero el número no puede"
  901. "empezar por e o E, ya que el compilador lo interpretaría en este caso como"
  902. "un identificador y no como un número."
  903. ""
  904. "Algunos ejemplos de constantes de este tipo: 1.0e9, -3E-8, -10.1."
  905. endvis
  906. beginvis
  907. coordenadas_completas 1 2 80 24
  908. color 15 1
  909. cabecera " TIPO VOID "
  910. borde 2
  911. "~Significa sin valor, sin tipo.~"
  912. ""
  913. "Uno de los usos de void se puede observar al comparar estos dos programas:"
  914. ""
  915. "       #include <stdio.h>              #include <stdio.h>"
  916. "       main ()                         void main (void)"
  917. "       {                               {"
  918. "         printf ("Versión 1.");          printf ("Versión 2.");"
  919. "         getchar ();                     getchar ();"
  920. "       }                               }"
  921. ""
  922. "Al poner void entre los paréntesis de la definición de una función, se"
  923. "define a ésta como función que no tiene argumentos. No confundir con"
  924. "llamada a función, en cuyo caso no se puede utilizar el void."
  925. ""
  926. "Del mismo modo, al poner void antes del nombre de la función en la"
  927. "definición de ésta, se está declarando como función que no devuelve"
  928. "nada."
  929. ""
  930. "La segunda versión es preferible y es la que se utilizará a lo largo"
  931. "de todo el tutor."
  932. endvis
  933. beginvis
  934. coordenadas_completas 1 2 80 24
  935. color 15 1
  936. cabecera " PROGRAMA EJEMPLO "
  937. borde 2
  938. "~#include <stdio.h>                                                          ~"
  939. "~                                                                            ~"
  940. "~void main (void)                                                            ~"
  941. "~{                                                                           ~"
  942. "~  int i = 1;                                                                ~"
  943. "~  char c = 'c';                                                             ~"
  944. "~  float f = 1.0;                                                            ~"
  945. "~  double d = 1e-1;                                                          ~"
  946. "~  printf ("  i = %d\n  c = %c\n  f = %f\n  d = %lf\n", i, c, f, d);         ~"
  947. "~  getchar ();                                                               ~"
  948. "~}                                                                           ~"
  949. ""
  950. "La salida de este programa es:"
  951. ""
  952. "~  i = 1~"
  953. "~  c = c~"
  954. "~  f = 1.000000~"
  955. "~  d = 0.100000~"
  956. ""
  957. "Como se puede observar en el programa, se puede asignar un valor a una"
  958. "variable en el momento de la declaración."
  959. ""
  960. "En la lección 1 ya se dijo que ~%d~ indica a la función printf el lugar en que"
  961. "se ha de escribir una variable de tipo entera. Los códigos ~%c~, ~%f~ y ~%lf~"
  962. "indican a la función printf el lugar en la cadena de caracteres en la que"
  963. "se han de escribir variables de tipo char, float y double respectivamente."
  964. endvis
  965. borrar_pantalla
  966. beginv
  967. color 12 1
  968. centrar_coordenadas_x 5
  969. cabecera " MODIFICADORES "
  970. ""
  971. "  A excepción del tipo void, los tipos  "
  972. "  de datos básicos pueden tener varios"
  973. "  modificadores precediéndolos."
  974. ""
  975. endv
  976. beginv
  977. centrar_coordenadas_x 16
  978. borde 1
  979. color 13 1
  980. ""
  981. "  Hay modificadores de tipo y de acceso.  "
  982. ""
  983. endv
  984. beginvis
  985. coordenadas_completas 1 2 80 24
  986. color 15 1
  987. cabecera " MODIFICADORES DE TIPO "
  988. borde 2
  989. "Un ~modificador de tipo~ se usa para alterar el significado del tipo base para"
  990. "que se ajuste más precisamente a las necesidades de cada momento."
  991. ""
  992. "Modificadores de tipo:"
  993. ""
  994. "  Modificador Descripción Tipos a los se les puede aplicar el modificador"
  995. "  ----------- ----------- -----------------------------------------------"
  996. "   ~signed  ~    con signo                   int, char"
  997. "   ~unsigned~    sin signo                   int, char"
  998. "   ~long    ~      largo                 int, char, double"
  999. "   ~short   ~      corto                     int, char"
  1000. ""
  1001. "El uso de signed con enteros es redundante aunque esté permitido, ya que"
  1002. "la declaración implícita de entero asume un número con signo."
  1003. ""
  1004. "El estándar ANSI elimina el long float por ser equivalente al double. Sin"
  1005. "embargo, como se puede observar en el último ejemplo visto, para escribir"
  1006. "un double con la función printf es necesario utilizar el código de formato"
  1007. "de printf: %lf; que significa: long float."
  1008. ""
  1009. "Se puede utilizar un modificador de tipo sin tipo; en este caso, el tipo se"
  1010. "asume que es int."
  1011. ""
  1012. "La longitud (y por tanto, también el rango) de los tipos dependen del sitema"
  1013. "que utilicemos; no obstante, la siguiente tabla es válida para la mayoría de"
  1014. "sistemas:"
  1015. ""
  1016. "      Tipo         Longitud en bytes               Rango"
  1017. "------------------ ----------------- ---------------------------------------"
  1018. "~char              ~         1         Caracteres ASCII"
  1019. "~unsigned char     ~         1         0 a 255"
  1020. "~signed char       ~         1         -128 a 127"
  1021. "~int               ~         2         -32768 a 32767"
  1022. "~unsigned int      ~         2         0 a 65535"
  1023. "~signed int        ~         2         Igual que int"
  1024. "~short int         ~         1         -128 a 127"
  1025. "~unsigned short int~         1         0 a 255"
  1026. "~signed short int  ~         1         Igual que short int"
  1027. "~long int          ~         4         -2147483648 a 2147483649"
  1028. "~signed long int   ~         4         -2147483648 a 2147483649"
  1029. "~unsigned long int ~         4         0 a 4294967296"
  1030. "~float             ~         4         Aproximadamente 6 dígitos de precisión"
  1031. "~double            ~         8         Aproximadamente 12 dígitos de precisión"
  1032. "~long double       ~        16         Aproximadamente 24 dígitos de precisión"
  1033. endvis
  1034. beginvis
  1035. coordenadas_completas 1 2 80 24
  1036. color 15 1
  1037. cabecera " MODIFICADORES DE ACCESO "
  1038. borde 2
  1039. "Acabamos de hablar de los modificadores de tipos y hemos dicho que modifican"
  1040. "el tipo básico. También hay otra clase que son los ~modificadores de acceso~."
  1041. "Como su propio nombre indica, estos modificadores modifican el acceso a los"
  1042. "tipos."
  1043. ""
  1044. "Estos modificadores son:"
  1045. ""
  1046. "  Modificador   Descripción"
  1047. "  -----------   -----------"
  1048. "    ~ const  ~     constante"
  1049. "    ~volatile~      volátil"
  1050. ""
  1051. "Las variables de tipo ~const~ son aquéllas a las que se les asigna un valor"
  1052. "inicial y este valor no puede ser cambiado a lo largo del programa. Se"
  1053. "utilizan para declarar constantes."
  1054. ""
  1055. "Ejemplo de declaración de una constante:"
  1056. ""
  1057. "  const unsigned int hola;"
  1058. ""
  1059. "Las variables de tipo ~volatile~ previenen al compilador que dicha variable"
  1060. "puede ser cambiada por medios no explícitamente especificados en el programa."
  1061. ""
  1062. "Obsérvese las siguientes setencias C:"
  1063. ""
  1064. "  int v;"
  1065. "  v = 1;"
  1066. "  v = 2;"
  1067. ""
  1068. "En estos casos, los compiladores suelen optimizar el código y la primera"
  1069. "sentencia de asignación se desecha y no se genera código para ella ya que"
  1070. "es redundante."
  1071. ""
  1072. "Si se hubiese declarado la variable v como volatile:"
  1073. ""
  1074. "  volatile v;"
  1075. ""
  1076. "la optimización descrita no se realizaría sobre la variable v, generándose"
  1077. "código para las dos asignaciones."
  1078. endvis
  1079. borrar_pantalla
  1080. beginv
  1081. color 14 5
  1082. centrar_coordenadas_y 4
  1083. "En C existen tipos derivados."
  1084. "Los ~tipos derivados~ son"
  1085. "aquéllos, que como su propio"
  1086. "nombre indica, derivan de los"
  1087. "tipos básicos."
  1088. endv
  1089. beginv
  1090. borde 1
  1091. centrar_coordenadas_y 42
  1092. "A continuación vamos a hablar de"
  1093. "un tipo derivado muy común en C:"
  1094. "las ~cadenas de caracteres~."
  1095. endv
  1096. borrar_pantalla
  1097. beginvis
  1098. coordenadas_completas 1 2 80 24
  1099. color 15 1
  1100. cabecera " CADENAS DE CARACTERES "
  1101. borde 2
  1102. "Una ~cadena de caracteres~ (también conocido por el nombre de ~string~) es"
  1103. "una secuencia de caracteres encerrados entre comillas."
  1104. ""
  1105. "Ejemplos de cadenas:"
  1106. ""
  1107. ""El amor es como la luna: cuando no crece es que mengua.""
  1108. ""abc""
  1109. ""a""
  1110. ""\n a \n b \n c \n""
  1111. ""
  1112. "Las comillas no forman parte de la secuencia. Sirven para especificar"
  1113. "el comienzo y final de ésta, al igual que los apóstrofos marcaban los"
  1114. "caracteres individuales."
  1115. ""
  1116. "Las cadenas son tratadas por el C como un array de caracteres."
  1117. ""
  1118. "Un ~array~ (conocido también con el nombre de ~vector~) es una secuencia de"
  1119. "datos que se encuentran almacenados en memoria de una forma consecutiva."
  1120. ""
  1121. "Un ~array de caracteres~ es una secuencia de caracteres."
  1122. ""
  1123. ""
  1124. "El array:"
  1125. ""
  1126. "  ~"abc"~"
  1127. ""
  1128. "se almacenaría en memoria como:"
  1129. ""
  1130. "  ~ ┌───┬───┬───┬────┐ ~"
  1131. "  ~ │ a │ b │ c │ \0 │ ~"
  1132. "  ~ └───┴───┴───┴────┘ ~"
  1133. ""
  1134. ""
  1135. "~El carácter '\0' se llama carácter nulo, y es utilizado por el C para marcar~"
  1136. "~el final de la cadena en memoria.                                           ~"
  1137. "El carácter nulo ('\0') no es la cifra 0 (cuyo código ASCII es 48), sino un"
  1138. "carácter no imprimible, cuyo código ASCII es 0."
  1139. ""
  1140. "Ejemplo:"
  1141. "~void main (void)                                                            ~"
  1142. "~{                                                                           ~"
  1143. "~  char ch1, ch2, ch3, ch4;                                                  ~"
  1144. "~  ch1 = '\0'; /* en memoria, ch1 tiene el valor 0 que es el valor ASCII     ~"
  1145. "~                 correspondiente al carácter '\0'                         */~"
  1146. "~  ch2 = 0;    /* en memoria, ch2 tiene el valor 0                         */~"
  1147. "~  ch3 = '0';  /* en memoria, ch3 tiene el valor 48 que es el valor ASCII    ~"
  1148. "~                 correspondiente al carácter '0'                          */~"
  1149. "~  ch4 = 48;   /* en memoria, ch4 tiene el valor 48                        */~"
  1150. "~}                                                                           ~"
  1151. ""
  1152. "Notad que en este programa no se ha puesto: #include <stdio.h>. Esto se debe"
  1153. "a que nuestro programa no utiliza ninguna información contenida en dicha"
  1154. "librería."
  1155. ""
  1156. "En las asignaciones anteriores, a ch1 y ch2 se les asigna el carácter nulo,"
  1157. "pero a las variables ch3 y ch4 se le asigna el carácter cero."
  1158. ""
  1159. "~Teniendo en cuenta el carácter nulo en la cadena "abc", esta cadena es un   ~"
  1160. "~array de tamaño 4 (tres caracteres más el carácter nulo).                   ~"
  1161. ""
  1162. "Obsérvese el siguiente programa."
  1163. ""
  1164. "~#include <stdio.h>                                                          ~"
  1165. "~                                                                            ~"
  1166. "~void main (void)                                                            ~"
  1167. "~{                                                                           ~"
  1168. "~  printf ("\nInvertir en conocimientos produce siempre los mejores "        ~"
  1169. "~          "intereses.\n(%s)", "Benjamín Franklin");                         ~"
  1170. "~}                                                                           ~"
  1171. ""
  1172. "La salida de este programa en pantalla es la siguiente:"
  1173. ""
  1174. "~Invertir en conocimientos produce siempre los mejores intereses.~"
  1175. "~(Benjamín Franklin)~"
  1176. ""
  1177. "En este ejemplo podemos observar la aparición de dos cosas nuevas: la divi-"
  1178. "sión de una cadena de caracteres en varias líneas y el código de formato %s."
  1179. ""
  1180. "El código ~%s~ le indica a la función printf que escriba una cadena en su"
  1181. "lugar."
  1182. ""
  1183. "Una cadena de caracteres se puede escribir en varias líneas de fichero"
  1184. "cerrando las comillas al final de la línea y volviéndolas a abrir en la"
  1185. "línea siguiente. Haciéndolo de este modo, el compilador lo interpreta como"
  1186. "una sola cadena de caracteres escrita en varias líneas. En C, los finales"
  1187. "de instrucciones no se detectan con los finales de línea sino con puntos y"
  1188. "comas al final de cada instrucción."
  1189. ""
  1190. "La sentencia:"
  1191. ""
  1192. "  printf ("\nInvertir en conocimientos produce siempre los mejores ""
  1193. "          "intereses.\n(%s)", "Benjamín Franklin");"
  1194. ""
  1195. "también se puede escribir, por ejemplo, del siguiente modo:"
  1196. ""
  1197. "  printf ("
  1198. "           "\nInvertir ""
  1199. "           "en conocimientos produce ""
  1200. "           "siempre los mejores""
  1201. "           " intereses.""
  1202. "           "\n(%s)","
  1203. "           "Benjamín ""
  1204. "           "Franklin""
  1205. "         );"
  1206. ""
  1207. "Yo, personalmente, ¡no sé porqué!, prefiero la primera versión a la segunda."
  1208. ""
  1209. "Conviene hacer la observación que ~'x' es distinto de "x"~. 'x' es una"
  1210. "constante carácter. "x" es una cadena de caracteres."
  1211. ""
  1212. "'x' pertenece a un tipo básico (char). "x" es de un tipo derivado (array"
  1213. "compuesto de elementos del tipo básico char). "x", en realidad, contiene"
  1214. "dos caracteres, a saber, 'x' y '\0'."
  1215. ""
  1216. "El estudio de los array se estudiará en profundidad en lecciones pos-"
  1217. "teriores; pero para comprender un poco mejor el concepto de array de"
  1218. "caracteres, vamos a hablar un poco más de ellos."
  1219. ""
  1220. "~Una variable array se declara:                                             ~"
  1221. "~                                                                           ~"
  1222. "~  tipo_de_cada_elemento variable_array [numero_de_elementos_del_array];    ~"
  1223. "~                                                                           ~"
  1224. "~y a cada elemento del array se accede:                                     ~"
  1225. "~                                                                           ~"
  1226. "~  variable_array [numero_de_elemento];                                     ~"
  1227. ""
  1228. "Es muy importante tener siempre en mente que al primer elemento de un array"
  1229. "se accede mediante:"
  1230. ""
  1231. "  variable_array [0];"
  1232. ""
  1233. "y al segundo elemento:"
  1234. ""
  1235. "  variable_array [1];"
  1236. ""
  1237. "y así sucesivamente para el acceso al resto de los elementos del array."
  1238. ""
  1239. "Programa ejemplo:"
  1240. ""
  1241. "~#include <stdio.h>                                                          ~"
  1242. "~                                                                            ~"
  1243. "~void main (void)                                                            ~"
  1244. "~{                                                                           ~"
  1245. "~  int x[2]; /* se reserva memoria para dos elementos de tipo int */         ~"
  1246. "~  x[0] = 10;                                                                ~"
  1247. "~  x[1] = 11;                                                                ~"
  1248. "~  /* el elemento x[2] no existe, mejor dicho, no se ha reservado memoria */ ~"
  1249. "~  printf ("\nx[0] = %d\nx[1] = %d\n", x[0], x[1]);                          ~"
  1250. "~}                                                                           ~"
  1251. ""
  1252. "Si en el programa anterior se hubiese hecho:"
  1253. ""
  1254. "   x [2] = 3;"
  1255. ""
  1256. "el compilador probablemente compilará sin problemas y no nos informará de"
  1257. "ningún error. PERO AL EJECUTAR EL PROGRAMA, EL VALOR 3 SE ESCRIBIRA EN UNA"
  1258. "POSICION DE MEMORIA NO ASIGNADA; ESTO PUEDE PRODUCIR RESULTADOS INESPERADOS;"
  1259. "pensad que el valor 3 se podría escribir sobre el código del sistema opera-"
  1260. "tivo o cualquier otro programa que esté en memoria en ese momento."
  1261. ""
  1262. "Al hacer la declaración"
  1263. ""
  1264. "  int x [2];"
  1265. ""
  1266. "estamos reservando memoria para x[0] y x[1], dicho de otro modo, int x[2]"
  1267. "reserva memoria para dos elementos."
  1268. ""
  1269. "Repitimos: hemos hablado de los arrays lo mínimo para poder entender los"
  1270. "arrays de caracteres; más adelante, en otra lección, se va hablar a fondo"
  1271. "sobre los arrays."
  1272. endvis
  1273. partir
  1274. beginv
  1275. cabecera " OPERADORES "
  1276. color 11 2
  1277. centrar_coordenadas_x 2
  1278. borde 2 (necesario por partir)
  1279. "Un ~operador~ es un símbolo que realiza una"
  1280. "determinada operación sobre sus operandos."
  1281. endv
  1282. beginv
  1283. color 11 1
  1284. borde 1
  1285. centrar_coordenadas_x 6
  1286. "Un ~operando~ es el dato que va a"
  1287. "ser manipulado por el operador."
  1288. endv
  1289. beginv
  1290. color 11 2
  1291. centrar_coordenadas_x 10
  1292. ""
  1293. "Los operadores en C se pueden dividir en cuatro grupos:"
  1294. ""
  1295. "  ~a) Operadores aritméticos.                         ~"
  1296. "  ~b) Operadores relacionales y lógicos.              ~"
  1297. "  ~c) Operadores a nivel de bits.                     ~"
  1298. "  ~d) Operadores especiales.                          ~"
  1299. ""
  1300. endv
  1301. beginv
  1302. color 11 1
  1303. borde 2
  1304. cabecera " EXPRESIONES "
  1305. centrar_coordenadas_x 20
  1306. "Las ~expresiones~ contienen variables y"
  1307. "constantes para producir nuevos valores."
  1308. endv
  1309. borrar_pantalla
  1310. beginvis
  1311. coordenadas_completas 1 2 80 24
  1312. color 15 1
  1313. cabecera " OPERADORES ARITMETICOS "
  1314. borde 2
  1315. "Los ~operadores aritméticos~ realizan operaciones aritméticas."
  1316. ""
  1317. "Son los siguientes:"
  1318. ""
  1319. "        Operador            Acción"
  1320. "        -------- ------------------------------"
  1321. "           ~- ~     Resta, también menos monario"
  1322. "           ~+ ~     Suma, también suma monaria"
  1323. "           ~* ~     Multiplicación"
  1324. "           ~/ ~     División"
  1325. "           ~% ~     División en módulo"
  1326. "           ~--~     Decremento"
  1327. "           ~++~     Incremento"
  1328. ""
  1329. "Los operadores de incremento y decremento solo se pueden aplicar a"
  1330. "variables, no constantes. El de incremento añade 1 a su operando y"
  1331. "el de decremento resta 1. En otras palabras,"
  1332. ""
  1333. "   ++x; o x++; es lo mismo que x = x + 1;"
  1334. ""
  1335. "y"
  1336. ""
  1337. "   --x; o x--; es lo mismo que x = x - 1;"
  1338. ""
  1339. "Los operadores de incremento y decremento pueden preceder o seguir al"
  1340. "operando. Si el operador precede al operando, C lleva a cabo la operación"
  1341. "antes de utilizar el valor del operando. Si el operador sigue al operando,"
  1342. "C utilizará su valor antes de incrementarlo o decrementarlo. Esto se ve"
  1343. "muy bien en los dos ejemplos siguientes:"
  1344. ""
  1345. "       int x, y;                         int x, y;"
  1346. "       x = 2;                            x = 2;"
  1347. "       y = ++x;                          y = x++;"
  1348. "       /* ahora x tiene el valor 3       /* ahora x tiene el valor 3"
  1349. "          e y tiene el valor 3 */           e y tiene el valor 2 */"
  1350. ""
  1351. "La precedencia de los operadores aritméticos es la siguiente:"
  1352. ""
  1353. "               MAYOR         ++  --"
  1354. "                             + (más monario)  - (menos monario)"
  1355. "                             *  /  %"
  1356. "               MENOR         +  -"
  1357. ""
  1358. "Los operadores del mismo nivel de precedencia son evaluados por el"
  1359. "compilador de izquierda a derecha. Se puede alterar el orden de"
  1360. "evaluación utilizando paréntesis."
  1361. ""
  1362. "Ejemplo:"
  1363. ""
  1364. "void main (void)"
  1365. "{"
  1366. "  int x1, x2, x3, x4, x5, x6;"
  1367. "  /* Asignaciones             */ /* Orden de asignaciones                 */"
  1368. "  x1 = 2 + 3 * 4;                /* x1 = 14;                              */"
  1369. "  x2 = (2 + 3) * 4;              /* x2 = 20;                              */"
  1370. "  x3 = -4 - (-1);                /* x3 = -3;                              */"
  1371. "  x4 = 10 / 2 % 3;               /* x4 = 2;                               */"
  1372. "  x5 = ++x3 - x4;                /* x3 = -2; x5 = -4;                     */"
  1373. "  x6 = x3++ - x4;                /* x6 = -4; x3 = -1;                     */"
  1374. "  x1 = -x1;                      /* x1 = -14;                             */"
  1375. "  x2 = (x1 + x2) / x3;           /* x2 = -6;                              */"
  1376. "  x3 = ((x1++) + (x2++)) - x3;   /* x3 = -19; x1 = -13; x2 = -5;          */"
  1377. "  x4 = -(-(-x3));                /* x4 = 19;                              */"
  1378. "  x5 = (x6 * x6 + x6 / x6);      /* x5 = 17;                              */"
  1379. "  x6 = (x1++) + (++x2) - (++x6); /* x2 = -4; x6 = -3; x6 = -14; x1 = -12; */"
  1380. "  x1++;                          /* x1 = -11;                             */"
  1381. "  --x2;                          /* x2 = -5;                              */"
  1382. "}"
  1383. endvis
  1384. beginvis
  1385. coordenadas_completas 1 2 80 24
  1386. cabecera " OPERADORES RELACIONALES Y LOGICOS "
  1387. color 15 1
  1388. borde 2
  1389. "La palabra relacional se refiere a la relación entre unos valores y otros."
  1390. "La palabra lógico se refiere a las formas en que esas relaciones pueden"
  1391. "conectarse entre sí."
  1392. ""
  1393. "Los vamos a ver juntos porque ambos operadores se basan en la idea de ~cierto~"
  1394. "(true en inglés) y ~falso~ (false en inglés). ~En C, cualquier valor distinto~"
  1395. "~de cero es cierto, y el valor 0 es falso.~ Las expresiones que son ciertas"
  1396. "toman el valor de 1 y las que son falsas toman el valor de 0."
  1397. ""
  1398. "Los operadores son:"
  1399. ""
  1400. "       Operadores relacionales           Operadores lógicos"
  1401. ""
  1402. "      Operador      Acción                Operador  Acción"
  1403. "      -------- -----------------          --------  ------"
  1404. "         ~> ~    Mayor que                     ~&&~       Y"
  1405. "         ~>=~    Mayor o igual que             ~||~       O"
  1406. "         ~< ~    Menor que                     ~! ~       NO"
  1407. "         ~<=~    Menor o igual que"
  1408. "         ~==~    Igual"
  1409. "         ~!=~    No igual"
  1410. ""
  1411. "Tabla de verdad para los operadores lógicos:"
  1412. ""
  1413. "        p q   p && q   p || q   !p"
  1414. ""
  1415. "        0 0     0        0      1"
  1416. "        0 1     0        1      1"
  1417. "        1 0     1        1      0"
  1418. "        1 1     0        1      0"
  1419. ""
  1420. ""
  1421. "Precedencia de estos operadores:"
  1422. ""
  1423. "        MAYOR     !"
  1424. "                  >  >=  <  <="
  1425. "                  ==  !="
  1426. "                  &&"
  1427. "        MENOR     ||"
  1428. ""
  1429. "Ejemplo:"
  1430. ""
  1431. "void main (void)"
  1432. "{"
  1433. "  int x1, x2, x3, x4, x5, x6;"
  1434. "  /* Asignaciones         */ /* Orden de asignaciones */"
  1435. "  x1 = 10 < 12;              /* x1 = 1;               */"
  1436. "  x2 = 10 > 12;              /* x2 = 0;               */"
  1437. "  x3 = -1 && 5;              /* x3 = 1;               */"
  1438. "  x4 = 0 || x3;              /* x4 = 1;               */"
  1439. "  x5 = x1 >= x2 <= x3;       /* x5 = 1;               */"
  1440. "  x6 = x1 == x2 || x3 != x4; /* x6 = 0;               */"
  1441. "  x1 = !x1;                  /* x1 = 0;               */"
  1442. "  x2 = ! (!x1 || x3 <= x3);  /* x2 = 0;               */"
  1443. "  x3 = 1 && 0;               /* x3 = 0;               */"
  1444. "  x4 = 1 || 0;               /* x4 = 1;               */"
  1445. "  x5 = !(-10);               /* x5 = 0;               */"
  1446. "  x6 = !!x4;                 /* x6 = 1;               */"
  1447. "}"
  1448. ""
  1449. "Una particularidad interesante del C es que la evaluación de una expresión"
  1450. "se termina en cuanto se sabe el resultado de dicha expresión. Veámoslo con"
  1451. "un ejemplo:"
  1452. ""
  1453. "  0 && x"
  1454. "  1 || x"
  1455. ""
  1456. "En las dos expresiones anteriores NO se evalúa x puesto que es superfluo:"
  1457. "en la primera expresión al ser uno de los dos operandos 0, el otro no hace"
  1458. "falta mirarlo; con la segunda expresión podemos decir lo mismo. Como los"
  1459. "operadores && y || se evalúan de izquiera a derecha, podemos asegurar que"
  1460. "es el segundo operando (el que contiene la x) el que no se valúa. Si la"
  1461. "expresión fuera: x && 0, se valuaría la x, y si ésta es cierta se evaluaría"
  1462. "el 0, y si la x fuera falsa, no se evaluaría el 0."
  1463. endvis
  1464. beginvis
  1465. coordenadas_completas 1 2 80 24
  1466. cabecera " OPERADORES A NIVEL DE BITS "
  1467. color 15 1
  1468. borde 2
  1469. "Estos operandos realizan operaciones sobre los bits de un byte o una"
  1470. "palabra (dos bytes). Sólo se pueden utilizar con los tipos char e int."
  1471. ""
  1472. "Estos operadores son:"
  1473. ""
  1474. "                 Operador Acción"
  1475. "                 -------- -----------------------------"
  1476. "                    ~ &~    Y"
  1477. "                    ~ |~    O"
  1478. "                    ~ ^~    O exclusiva (XOR)"
  1479. "                    ~ ~~~    Complemento a uno (NOT)"
  1480. "                    ~>>~    Desplazamiento a la derecha"
  1481. "                    ~<<~    Desplazamiento a la izquierda"
  1482. ""
  1483. "Las tablas de verdad de los operadores &, | e ~~ son las mismas que las"
  1484. "tablas de verdad de los operadores &&, || y ! respectivamente; pero los"
  1485. "operadores a nivel de bits trabajan bit a bit."
  1486. "La tabla de verdad para el XOR es:"
  1487. ""
  1488. "         p q   p ^ q"
  1489. "         0 0     0"
  1490. "         1 0     1"
  1491. "         1 1     0"
  1492. "         0 1     1"
  1493. ""
  1494. "Signifiquemos que los operadores relacionales y lógicos siempre producen un"
  1495. "resultado que es 0 ó 1, mientras que las operaciones entre bits producen"
  1496. "cualquier valor arbitrario de acuerdo con la operación específica. En otras"
  1497. "palabras, las operaciones a nivel de bits pueden dar valores distintos de 0"
  1498. "ó 1, pero los operadores lógicos siempre dan 0 ó 1."
  1499. ""
  1500. "Ejemplo:"
  1501. ""
  1502. "  char x, y, z1, z2;"
  1503. "  x = 2; y = 3; z1 = 2 && 3; z2 = 2 & 3; /* z1 = 1; z2 = 2 */"
  1504. ""
  1505. "¿Por qué (2 && 3) es 1 y (2 & 3) es 2?"
  1506. "2&&3: el compilador evalúa la expresión 1 && 1 que es 1."
  1507. "2&3: el compilador evalúa 00000010 & 00000011 que es 00000010 (2 en decimal)"
  1508. ""
  1509. "Sintaxis para los operadores de desplazamiento:"
  1510. ""
  1511. "          ~expresión >> número de bits a desplazar a la derecha  ~"
  1512. "          ~expresión << número de bits a desplazar a la izquierda~"
  1513. ""
  1514. "Dos observaciones sobre los operadores de desplazamiento:"
  1515. ""
  1516. "  1) Un desplazamiento no es una rotación. O sea, los bits que salen por un"
  1517. "     extremo no se introducen por el otro."
  1518. ""
  1519. "  2) Normalmente, a medida que se desplaza los bits hacia un extremo se va"
  1520. "     rellenando con ceros por el extremo opuesto. PERO NO EN TODOS LOS OR-"
  1521. "     DENADORES ES ASI. Si queremos introducir ceros y que el programa sea"
  1522. "     portátil lo tenemos que hacer explícitamente con una operación and."
  1523. ""
  1524. "Tabla de precedencia:"
  1525. ""
  1526. "    MAYOR   ~~"
  1527. "            <<  >>"
  1528. "            &"
  1529. "            ^"
  1530. "    MENOR   |"
  1531. ""
  1532. "Ejemplos:"
  1533. ""
  1534. "void main (void)"
  1535. "{"
  1536. "  char x, y;"
  1537. "  /* Asignaciones   x en bits   y en bits   valor de x   valor de y */"
  1538. "  /* ------------   ---------   ---------   ----------   ---------- */"
  1539. "  x = 2; y = 3;  /* 0000 0010   0000 0011        2            3     */"
  1540. "  y = y << 1;    /* 0000 0010   0000 0110        2            6     */"
  1541. "  y = x | 9;     /* 0000 0010   0000 1011        2           11     */"
  1542. "  y = y << 3;    /* 0000 0010   0101 1000        2           88     */"
  1543. "  x = ~~x;        /* 1111 1101   0101 1000       -3           88     */"
  1544. "  x = 4 ^ 5 & 6; /* 0000 0000   0101 1000        0           88     */"
  1545. "}"
  1546. endvis
  1547. beginvis
  1548. coordenadas_completas 1 2 80 24
  1549. cabecera " OPERADORES ESPECIALES "
  1550. color 15 1
  1551. borde 2
  1552. "Bajo este apartado se recogen una serie de operadores no agrupables en"
  1553. "ninguno de los grupos anteriores."
  1554. ""
  1555. "Estos operadores son los siguientes:"
  1556. ""
  1557. "     ~?     ~"
  1558. "     ~& *   ~"
  1559. "     ~sizeof~"
  1560. "     ~,     ~"
  1561. "     ~. ->  ~"
  1562. "     ~() [] ~"
  1563. ""
  1564. "Veamos cada uno de estos operadores."
  1565. ""
  1566. ""
  1567. "~OPERADOR CONDICIONAL (?).~"
  1568. "~-------------------------~"
  1569. ""
  1570. "El operador ? tiene la forma general:"
  1571. ""
  1572. "  ~expresion_1  ?  expresion_2  :  expresion_3~"
  1573. ""
  1574. "donde expresion_1, expresion_2 y expresion_3 son expresiones C."
  1575. ""
  1576. "El operador ? actúa de la siguiente forma: Evalúa expresion_1. Si es cierta,"
  1577. "evalúa expresion_2 y toma ese valor para la expresión. Si expresion_1 es"
  1578. "falsa, evalúa expresion_3 y toma su valor para la expresión."
  1579. ""
  1580. "Ejemplo:"
  1581. ""
  1582. "  int x, y;"
  1583. "  x = 2 < 3 ? 4 : 5; /* a x se le asigna el valor 4: x = 4; */"
  1584. "  y = 2 > 3 ? 4 : 5; /* a y se le asigna el valor 5: x = 5; */"
  1585. "  x = 1 < 2 ? (4 > 3 ? 2 : 3) : 5; /* a x se le asigna el valor 2: x = 2;"
  1586. ""
  1587. ""
  1588. "~OPERADORES DE DIRECCION (&) Y DE CONTENIDO (*).~"
  1589. "~-----------------------------------------------~"
  1590. ""
  1591. "Estos dos operadores operan con punteros. Los dos son monarios."
  1592. ""
  1593. "~Un puntero es una variable que contiene una dirección de memoria.~"
  1594. ""
  1595. "El significado que tiene en este caso el operador * no tiene absolutamente"
  1596. "nada que ver con el que tiene el operador aritmético *. En el código fuente"
  1597. "no hay confusión entre uno y otro pues el aritmético es binario y el de"
  1598. "punteros es monario. Lo mismo ocurre con el operador &."
  1599. ""
  1600. "En este momento no vamos a decir nada más de estos dos operadores y de"
  1601. "punteros. Ya llegará el momento más adelante."
  1602. ""
  1603. ""
  1604. "~OPERADOR sizeof.~"
  1605. "~----------------~"
  1606. ""
  1607. "El operador sizeof es un operador monario que toma el valor de la longitud,"
  1608. "en bytes, de una expresión o de un tipo; en este último caso, el tipo ha de"
  1609. "estar entre paréntesis."
  1610. ""
  1611. "Ejemplo:"
  1612. ""
  1613. "  double d;"
  1614. "  int longitud_en_bytes_de_la_variable_d, longitud_en_bytes_del_tipo_char;"
  1615. "  longitud_en_bytes_de_la_variable_d = sizeof d;"
  1616. "  longitud_en_bytes_del_tipo_char = sizeof (char);"
  1617. "  /* en la mayoría de los sistemas: sizeof d es 8 y sizeof (char) es 1 */"
  1618. ""
  1619. ""
  1620. "~OPERADOR COMA (,).~"
  1621. "~------------------~"
  1622. ""
  1623. "La coma (,) tiene dos usos muy distintos en C:"
  1624. ""
  1625. "1) Para representar una lista de elementos:"
  1626. ""
  1627. "Ejemplos:"
  1628. ""
  1629. "  int a, b, c;"
  1630. "  printf ("%d%d%d", 1, 2, 3);"
  1631. ""
  1632. "2) Como operador."
  1633. ""
  1634. "Como operador, la coma encadena varias expresiones. Estas expresiones son"
  1635. "evaluadas de izquierda a derecha y el valor de la expresión total es el"
  1636. "valor de la expresión más a la derecha."
  1637. ""
  1638. "Ejemplo:"
  1639. ""
  1640. "  int x;"
  1641. "  x = (2, 3, 4); /* a x se le asigna el valor 4: x = 4; */"
  1642. ""
  1643. ""
  1644. "~OPERADORES PUNTO (.) Y FLECHA (->).~"
  1645. "~-----------------------------------~"
  1646. ""
  1647. "Estos dos operadores se utilizan con dos tipos compuestos: estruct (estruc-"
  1648. "tura) y union (unión)."
  1649. ""
  1650. "El significado, tanto de los tipos compuestos struct y union, como de los"
  1651. "operadores . y ->, se estudiará en lecciones posteriores."
  1652. ""
  1653. "Aquí se han nombrado estos dos operadores para saber que existen y para"
  1654. "hacer una tabla de precedencia con todos los operadores del C un poco más"
  1655. "adelante, en esta misma lección."
  1656. ""
  1657. ""
  1658. "~OPERADORES PARENTESIS () Y CORCHETES [].~"
  1659. "~----------------------------------------~"
  1660. ""
  1661. "Los paréntesis se pueden considerar como operadores que aumentan la"
  1662. "precedencia de las operaciones que contienen."
  1663. ""
  1664. "Ejemplo:"
  1665. ""
  1666. "  int x = 1 - 2 * 3;   /* a x se le asigna el valor -5: x = -5; */"
  1667. "  int y = (1 - 2) * 3; /* a y se le asigna el valor -3: x = -3; */"
  1668. ""
  1669. "Los paréntesis también se usan, dentro de una expresión, para especificar"
  1670. "la llamada a una función."
  1671. ""
  1672. "Ejemplo:"
  1673. ""
  1674. "  printf ("La inactividad sólo apetece cuando tenemos demasiado que hacer.""
  1675. "          "\n(Noël Coward)"); getchar ();"
  1676. ""
  1677. "Los corchetes llevan acabo el indexamiento de arrays. Ya hemos hablado"
  1678. "anteriormente un poco de ellos y se estudiará en detalle en otras lecciones."
  1679. ""
  1680. "Ejemplo:"
  1681. ""
  1682. "  float f[3]; /* reserva memoria para tres float: f[0], f[1] y f[2] */"
  1683. "  f[0] = 1.1; f[1] = 2.2; f[2] = 3.3; /* tres asignaciones */"
  1684. endvis
  1685. borrar_pantalla
  1686. beginv
  1687. color 1 7
  1688. centrar_coordenadas_x 2
  1689. cabecera " SENTENCIAS DE ASIGNACION "
  1690. "~Una sentencia de asignación es una sentencia C~"
  1691. "~en la que se asigna un valor a una variable.  ~"
  1692. endv
  1693. beginv
  1694. centrar_coordenadas_x 3
  1695. borde 1
  1696. "La forma general de la sentencia de asignación es:"
  1697. ""
  1698. "~nombre_variable operador_de_asignacion expresion;~"
  1699. ""
  1700. "donde operador_de_asignacion es uno de los operadores siguientes:"
  1701. ""
  1702. "~=~, ~*=~, ~/=~, ~%=~, ~+=~, ~-=~, ~<<=~, ~>>=~, ~&=~, ~^=~, ~|=~."
  1703. endv
  1704. beginv
  1705. centrar_coordenadas_x 4
  1706. "Con el operador =, el significado"
  1707. "de la asignación es dar el valor"
  1708. "de la expresión de la parte derecha"
  1709. "a la variable que se encuentra en"
  1710. "la parte izquierda del operador =."
  1711. ""
  1712. "Ejemplo:"
  1713. "  int a, b, c;"
  1714. "  a = 5;"
  1715. "  b = 4 + a;"
  1716. "  c = (a * b) - 1;"
  1717. endv
  1718. beginv
  1719. centrar_coordenadas_x 5
  1720. "Una sentencia de asignación es una expresión. El valor de esta expresión"
  1721. "es el valor que se le asigna a la variable. El operador de asignación se"
  1722. "evalúa de derecha a izquierda."
  1723. ""
  1724. "Ejemplo:"
  1725. "  int x, y;"
  1726. "  x = y = 2; /* el 2 se asigna primero a la y y después a la x */"
  1727. ""
  1728. "Hemos dicho que el operador de asignación se evalúa de derecha a izquier-"
  1729. "da, así que primero se hace y = 2 y el valor de esta expresión es 2, este"
  1730. "valor se asigna a x y el valor de la expresión total es 2."
  1731. ""
  1732. "También se podía haber hecho:"
  1733. "  x = (y = 2);"
  1734. "pero en este caso los paréntesis son innecesarios porque no cambian la"
  1735. "precedencia."
  1736. endv
  1737. beginv
  1738. centrar_coordenadas_x 6
  1739. "El resto de operadores de asignación se exponen en la siguiente"
  1740. "tabla:"
  1741. ""
  1742. " ~Sentencia de asignación~   ~Sentencia de asignación equivalente~"
  1743. " ~-----------------------~   ~-----------------------------------~"
  1744. " ~       x *= y;         ~   ~             x = x * y;            ~"
  1745. " ~       x /= y;         ~   ~             x = x / y;            ~"
  1746. " ~       x %= y;         ~   ~             x = x % y;            ~"
  1747. " ~       x += y;         ~   ~             x = x + y;            ~"
  1748. " ~       x -= y;         ~   ~             x = x - y;            ~"
  1749. " ~       x <<= y;        ~   ~             x = x << y;           ~"
  1750. " ~       x >>= y;        ~   ~             x = x >> y;           ~"
  1751. " ~       x &= y;         ~   ~             x = x & y;            ~"
  1752. " ~       x ^= y;         ~   ~             x = x ^ y;            ~"
  1753. " ~       x |= y;         ~   ~             x = x | y;            ~"
  1754. " x e y son dos variables."
  1755. endv
  1756. borrar_pantalla
  1757. beginv
  1758. color 0 7
  1759. centrar_coordenadas_x 3
  1760. borde 2
  1761. no_sombra
  1762. cabecera " INICIALIZACIONES DE VARIABLES "
  1763. "La forma de inicialización es:"
  1764. ""
  1765. "~tipo nombre_variable = expresión;~"
  1766. ""
  1767. "Ejemplo:"
  1768. "  float f = 3.0;"
  1769. endv
  1770. beginv
  1771. borde 1
  1772. coordenadas 1 11
  1773. "~También se pueden inicializar varias variables separadas por comas en una   ~"
  1774. "~misma sentencia.                                                            ~"
  1775. ""
  1776. "Ejemplos:"
  1777. "  int x = 1; /* declaración e inicialización de x */"
  1778. "  char ch1 = 'a', ch2 = 'b'; /* declaración e inicialización de ch1 y ch2 */"
  1779. "  float f1 = 2.2, f2 = 3e3; /* declaración e inicialización de f1 y f2 */"
  1780. "  int x, y = 3, z;/* declaración de x, y, z pero inicialización sólo de y */"
  1781. "  double d = 1.1 - 2.2; /* declaración e inicialización de d */"
  1782. "  int a = 1 + 2, b = 4, c; /* declaración de a, b, c pero esta última no se"
  1783. "                            inicializa */"
  1784. endv
  1785. borrar_pantalla
  1786. beginvis
  1787. color 1 7
  1788. coordenadas_completas 7 3 72 23
  1789. borde 2
  1790. cabecera " CONVERSION DE TIPOS "
  1791. "La conversión de tipos se refiere a la situación en la que se"
  1792. "mezclan variables de un tipo con variables de otro tipo."
  1793. ""
  1794. "Cuando esto ocurre en una sentencia de asignación, la regla"
  1795. "de conversión de tipo es muy fácil: el valor de lado derecho"
  1796. "de la expresión se convierte al del lado izquierdo."
  1797. ""
  1798. "Ejemplo:"
  1799. ""
  1800. " int x = 2.3; /* 2.3 se convierte a 2 */"
  1801. " char ch = 500; /* los bits más significativos de 500 se"
  1802. "                   pierden */"
  1803. ""
  1804. "El tipo que resulta de aplicar un operador con dos operandos"
  1805. "de tipos diferentes, es el tipo de mayor tamaño (mayor longi-"
  1806. "tud en bytes)."
  1807. ""
  1808. "Ejemplo:"
  1809. ""
  1810. "  2 + 3.3; /* el valor de esta expresión es 5.3, o sea,"
  1811. "              un valor de tipo float */"
  1812. ""
  1813. "Es posible forzar a que una expresión sea de un tipo determi-"
  1814. "nado utilizando una construcción denominada ~molde~."
  1815. ""
  1816. "La forma general de un molde es: ~(tipo) expresión~"
  1817. ""
  1818. "El molde se puede considerar como un operador monario teniendo"
  1819. "la misma precedencia que el resto de los operadores monarios."
  1820. ""
  1821. "Ejemplos:"
  1822. ""
  1823. "     Expresión     Valor de la expresión Tipo de la expresión"
  1824. "  ---------------  --------------------- --------------------"
  1825. "       3 / 2               int                    1 "
  1826. "      3.0 / 2             float                  1.5"
  1827. "  (float) (3 / 2)         float                  1.0"
  1828. "   (float) 3 / 2          float                  1.5"
  1829. ""
  1830. "En la expresión (float) 3 / 2, al ser (float) un operador"
  1831. "monario, tiene más prioridad que el operador binario /."
  1832. ""
  1833. "Una constante decimal, octal o hexadecimal seguida por la"
  1834. "letra ~l~ o ~L~, se interpreta como una constante long."
  1835. ""
  1836. "Las siguientes expresiones son equivalentes:"
  1837. ""
  1838. "  4l"
  1839. "  4L"
  1840. "  (long) 4"
  1841. ""
  1842. "También se puede utilizar el tipo void en los moldes."
  1843. ""
  1844. "Por ejemplo:"
  1845. ""
  1846. "  (2 + 3); /* expresión entera */"
  1847. "  (void) (2 + 3); /* expresión sin ningún tipo */"
  1848. endvis
  1849. borrar_pantalla
  1850. beginvis
  1851. color 15 2
  1852. coordenadas_completas 7 2 72 23
  1853. borde 2
  1854. no_posicion
  1855. cabecera " PRECEDENCIA DE OPERADORES "
  1856. ""
  1857. "    Mayor     ()  []  ->  ."
  1858. "              !  ~~  ++  --  -  (tipo)  *  &  sizeof"
  1859. "              *  /  %"
  1860. "              <<  >>"
  1861. "              <  <=  >  >="
  1862. "              ==  !="
  1863. "              &"
  1864. "              ^"
  1865. "              |"
  1866. "              &&"
  1867. "              ||"
  1868. "              ?"
  1869. "              =  +=  -=  *=  /=  %=  &=  ^=  |=  <<=  >>="
  1870. "    Menor     ,"
  1871. ""
  1872. "Los operadores unarios, el condicional y los de asignación"
  1873. "asocian de derecha a izquierda; los demás asocian de izquierda"
  1874. "a derecha."
  1875. "Veamos los pasos que se siguen al evaluar algunas expresiones:"
  1876. ""
  1877. "Expresión 1: 10 < 5 && 8 >= 3"
  1878. "Paso 1:         0   && 8 >= 3"
  1879. "Paso 2:         0   &&   1"
  1880. "Paso 3:             0"
  1881. ""
  1882. "Expresión 2: x = (y = 3), y"
  1883. "Paso 1: a la variable y se le asigna el valor 3"
  1884. "Paso 2: el valor de la expresión coma es y, o sea, 3"
  1885. "Paso 3: a la variable x se le asigna el valor 3"
  1886. "Paso 4: el valor de toda la expresión es x, es decir, 3"
  1887. ""
  1888. "Expresión 3: 1 + 2 < 3 || 4 + 5 > 2"
  1889. "Paso 1:        3   < 3 || 4 + 5 > 2"
  1890. "Paso 2:            0   || 4 + 5 > 2"
  1891. "Paso 3:            0   ||   9   > 2"
  1892. "Paso 4:            0   ||       1"
  1893. "Paso 5:                 1"
  1894. ""
  1895. "Expresión 4: (-3 < !2) >> (~~-3)"
  1896. "Paso 1:      (-3 < 0 ) >> (~~-3)"
  1897. "Paso 2:          1     >> (~~-3)"
  1898. "Paso 3:          1     >>   2"
  1899. "Paso 4:                0"
  1900. ""
  1901. "Expresión 5: 2 < 3 < ((4 - 1) / !3)"
  1902. "Paso 1:        1   < ((4 - 1) / !3)"
  1903. "Paso 2:        1   < (   3    / !3)"
  1904. "Paso 3:        1   < (   3    / 0 )"
  1905. "Paso 4: Error: División por cero."
  1906. ""
  1907. "Expresión 6: (double) (int) (!-3 / (float) 2)"
  1908. "Paso 1:      (double) (int) ( 0  / (float) 2)"
  1909. "Paso 2:      (double) (int) ( 0  / 2.0)"
  1910. "Paso 3:      (double) (int)     0.0"
  1911. "Paso 4:      (double)   0"
  1912. "Paso 5:         0.0"
  1913. ""
  1914. endvis
  1915. end lección 2
  1916.  
  1917. ; LECCION 3
  1918. begin
  1919. beginv
  1920. borde 2
  1921. color 1 7
  1922. centrar_coordenadas
  1923. cabecera " INTRODUCCION A LA LECCION 3 "
  1924. "~                                                                      ~"
  1925. "~  En esta lección vamos a estudiar todas las sentencias que posee el  ~"
  1926. "~  C para cambiar el flujo del programa. Entre ellas están las sen-    ~"
  1927. "~  tencias condicionales ~if~ y ~switch~; las sentencias iterativas ~while~, ~"
  1928. "~  ~for~ y ~do~; y las sentencias ~break~, ~continue~, ~goto~ y ~return~; La sen-  ~"
  1929. "~  tencia return sólo se menciona aquí, pues se estudiará en la lección~"
  1930. "~  dedicada al estudio de las funciones de C.                          ~"
  1931. "~                                                                      ~"
  1932. endv
  1933. borrar_pantalla
  1934. beginv
  1935. cabecera " SENTENCIAS C "
  1936. color 14 5
  1937. coordenadas_completas 2 3 77 23
  1938. "Una sentencia en C puede ser:"
  1939. ""
  1940. "- Una ~sentencia simple~."
  1941. "    printf ("Filosofía de Murphy: Sonría; mañana puede ser peor.");"
  1942. "    y = 4 + 1; /* sentencia de asignación */"
  1943. "    ; /* sentencia que no hace nada */"
  1944. ""
  1945. "- Una ~sentencia compuesta~."
  1946. "    { /* sentencia compuesta formada por dos sentencias simples */"
  1947. "      --x;"
  1948. "      printf ("Ley de Murphy: Si algo puede salir mal, saldrá mal.");"
  1949. "    }"
  1950. "    { } /* sentencia que no hace nada */"
  1951. ""
  1952. pulsación
  1953. "Las sentencias if, switch, while, for y do son sentencias simples. Todas"
  1954. "estas sentencias las veremos en esta lección. ~Una sentencia compuesta~"
  1955. "~está formada por ninguna, una o varias sentencias simples delimitadas~"
  1956. "~entre llaves.~ A las sentencias compuestas también reciben el nombre de"
  1957. "~bloques~.Las sentencias simples son todas aquéllas que no son compuestas."
  1958. borrar_ventana
  1959. ""
  1960. ""
  1961. "                          SENTENCIAS DE CONTROL: "
  1962. ""
  1963. ""
  1964. pulsación
  1965. "                    La mayoría de las sentencias"
  1966. "                    de control de cualquier lenguaje"
  1967. "                    están basadas en condiciones."
  1968. ""
  1969. pulsación
  1970. "                    Una condición es una expresión cuya"
  1971. "                    resolución da como resultado cierto"
  1972. "                    (true) o falso (false)."
  1973. ""
  1974. pulsación
  1975. "                    Muchos lenguajes de programación"
  1976. "                    incorporan los valores true y false;"
  1977. "                    en C cualquier valor distinto de cero"
  1978. "                    es true, y el valor cero es false."
  1979. endv
  1980. borrar_pantalla
  1981. beginv
  1982. color 14 4
  1983. cabecera " SENTENCIAS CONDICIONALES "
  1984. centrar_coordenadas
  1985. ""
  1986. "  C posee dos sentencias condicionales: ~if~ y ~switch~."
  1987. ""
  1988. pulsación
  1989. "  Además, el operador ~?~ es una posible alternativa para  "
  1990. "  if en ciertas situaciones."
  1991. ""
  1992. endv
  1993. borrar_pantalla
  1994. beginv
  1995. color 15 1
  1996. coordenadas_completas 1 2 80 4
  1997. ""
  1998. "                                Sentencia if"
  1999. endv
  2000. beginv
  2001. color 15 2
  2002. cabecera " SINTAXIS "
  2003. coordenadas 3 5
  2004. ""
  2005. "  ~if (expresión)~"
  2006. "  ~  sentencia   ~"
  2007. "                  "
  2008. "  o               "
  2009. "                  "
  2010. "  ~if (expresión)~"
  2011. "  ~  sentencia_1 ~"
  2012. "  ~else          ~"
  2013. "  ~  sentencia_2 ~"
  2014. ""
  2015. endv
  2016. beginv
  2017. cabecera " DESCRIPCION "
  2018. coordenadas 28 7
  2019. "Si expresión es cierta se ejecuta la sentencia"
  2020. "correspondiente al if. Si expresión es falsa se"
  2021. "ejecuta la sentencia correspondiente al else si"
  2022. "lo hay."
  2023. ""
  2024. "En la segunda sintaxis se ejecuta sentencia_1 o"
  2025. "sentencia_2, pero nuna ambas."
  2026. endv
  2027. beginv
  2028. cabecera " EJEMPLOS "
  2029. centrar_coordenadas_x 18
  2030. "     ~if (contador < 50)~     ~if (x < y)~      ~if (ch == '\n')            ~"
  2031. "     ~  contador++;     ~     ~  z = x;  ~      ~  {                        ~"
  2032. "                            ~else      ~      ~    numero_de_lineas++;    ~"
  2033. "                            ~  z = y;  ~      ~    numero_de_caracteres++;~     "
  2034. "                                            ~  }                        ~"
  2035. endv
  2036. beginv
  2037. cabecera " OBSERVACIONES "
  2038. coordenadas_completas 26 5 80 24
  2039. ""
  2040. "1) Lo siguiente es incorrecto:"
  2041. ""
  2042. "  ~if (expresión)~"
  2043. "  ~  {           ~"
  2044. "  ~    sentecias ~"
  2045. "  ~  };          ~"
  2046. "  ~else          ~"
  2047. "  ~  sentencia   ~"
  2048. ""
  2049. "puesto que entre el if y el else sólo puede haber"
  2050. "una sentencia y aquí hay dos: { } y ;."
  2051. borrar_ventana
  2052. "2) Al ser la sentencia if una sentencia simple,"
  2053. "la sentencias if se pueden anidar:"
  2054. ""
  2055. "  ~/*                                           ~"
  2056. "  ~   a la variable numero_menor se le asigna la~"
  2057. "  ~   variable con menor valor entre x, y, z    ~"
  2058. "  ~*/                                           ~"
  2059. "  ~if (x <= y)                                  ~"
  2060. "  ~  if (x <= z)                                ~"
  2061. "  ~    numero_menor = x;                        ~"
  2062. "  ~  else                                       ~"
  2063. "  ~    numero_menor = z;                        ~"
  2064. "  ~else                                         ~"
  2065. "  ~  if (y <= z)                                ~"
  2066. "  ~    numero_menor = y;                        ~"
  2067. "  ~  else                                       ~"
  2068. "  ~    numero_menor = z;                        ~"
  2069. borrar_ventana
  2070. "3) El else siempre está asociado al if más cercano."
  2071. "Los dos siguientes ejemplos son distintos:"
  2072. ""
  2073. "  ~/* Ejemplo 1: */~"
  2074. "  ~if (n > 0)      ~"
  2075. "  ~  if (a > b)    ~"
  2076. "  ~    z = a;      ~"
  2077. "  ~  else          ~"
  2078. "  ~    z = b;      ~"
  2079. ""
  2080. "  ~/* Ejemplo 2: */~"
  2081. "  ~if (n > 0)      ~"
  2082. "  ~  {             ~"
  2083. "  ~    if (a > b)  ~"
  2084. "  ~      z = a;    ~"
  2085. "  ~  }             ~"
  2086. "  ~else            ~"
  2087. "  ~  z = b;        ~"
  2088. borrar_ventana
  2089. "4) Un constructor común en programación es la"
  2090. "escala if-else-if. Tiene la forma siguiente:"
  2091. "~if (expresión_1)     ~  ~/* Ejemplo: numero_menor    ~"
  2092. "~  sentencia_1        ~  ~toma el valor de la variable~"
  2093. "~else if (expresión_2)~  ~menor entre x, y, z */      ~"
  2094. "~  sentencia_2        ~  ~if (x <= y && x <= z)       ~"
  2095. "~ .                   ~  ~  numero_menor = x;         ~"
  2096. "~ .                   ~  ~else if (y <= z && y <= z)  ~"
  2097. "~ .                   ~  ~  numero_menor = y;         ~"
  2098. "~else                 ~  ~else                        ~"
  2099. "~  sentencia_n        ~  ~  numero_menor = z;         ~"
  2100. ""
  2101. "Las condiciones se evalúan de arriba hacia abajo."
  2102. "Sólo se ejecuta la sentencia correspondiente a la"
  2103. "primera expresión que sea cierta, si la hay. Si"
  2104. "ninguna expresión es cierta, se ejecuta el else fi-"
  2105. "nal si existe, sino no se ejecuta ninguna sentencia."
  2106. borrar_ventana
  2107. "5) El operador ? se puede utilizar para reemplazar"
  2108. "las sentencias if-else. Este operador ternario se"
  2109. "ha visto en la lección 2."
  2110. ""
  2111. "~/* Ejemplo 1 con if-else */~ ~/* Ejemplo 1 con ?: */ ~"
  2112. "~if (x <= y)                ~ ~z = x <= y ? x : y;    ~"
  2113. "~  z = x;                   ~"
  2114. "~else                       ~"
  2115. "~  z = y;                   ~"
  2116. ""
  2117. "~/* Ejemplo 2 con if-else */~ ~/* Ejemplo 2 con ?: */ ~"
  2118. "~if (n == 1)                ~ ~n == 1 ?               ~"
  2119. "~  printf ("Mensaje 1");    ~ ~  printf ("Mensaje 1"):~"
  2120. "~else                       ~ ~  printf ("Mensaje 2");~"
  2121. "~  printf ("Mensaje 2");    ~"
  2122. endv
  2123. borrar_pantalla
  2124. beginv
  2125. color 15 1
  2126. coordenadas_completas 1 2 80 4
  2127. ""
  2128. "                              Sentencia switch"
  2129. endv
  2130. beginv
  2131. color 15 2
  2132. cabecera " FORMA GENERAL "
  2133. coordenadas 1 5
  2134. no_sombra
  2135. "~switch (expresión)             ~"
  2136. "~  {                            ~"
  2137. "~    case expresión_constante_1:~"
  2138. "~      sentencias_1             ~"
  2139. "~      break;                   ~"
  2140. "~    case expresión_constante_2:~"
  2141. "~      sentencias_2             ~"
  2142. "~      break;                   ~"
  2143. "~    case expresión_constante_3:~"
  2144. "~      sentencias_3             ~"
  2145. "~      break;                   ~"
  2146. "~     .                         ~"
  2147. "~     .                         ~"
  2148. "~     .                         ~"
  2149. "~    default:                   ~"
  2150. "~      sentencias_n             ~"
  2151. "~  }                            ~"
  2152. endv
  2153. beginv
  2154. coordenadas 36 5
  2155. cabecera " DESCRIPCION "
  2156. "En muchas ocasiones es más elegante uti-"
  2157. "lizar la sentencia switch que la escala"
  2158. "if-else-if."
  2159. ""
  2160. "Una expresión constante es una expresión"
  2161. "en la que todos los operandos son cons-"
  2162. "tantes."
  2163. ""
  2164. "El switch evalúa expresión. A continua-"
  2165. "ción evalúa cada una de las expresiones"
  2166. "constantes hasta que encuentra una que"
  2167. "coincida con expresión. Cuando la encuen-"
  2168. "tra ejecuta las sentencias correspondien-"
  2169. "tes a ese case. Si no hay ninguna expre-"
  2170. "sión case que coincida con expresión, se"
  2171. "ejecuta las sentencias correspondientes"
  2172. "al default."
  2173. endv
  2174. beginv
  2175. coordenadas 44 5
  2176. cabecera " EJEMPLO "
  2177. no_sombra
  2178. "~switch (operando)        ~"
  2179. "~  {                      ~"
  2180. "~    case 1:              ~"
  2181. "~      x *= y;            ~"
  2182. "~      break;             ~"
  2183. "~    case 2:              ~"
  2184. "~      x /= y;            ~"
  2185. "~      break;             ~"
  2186. "~    case 3:              ~"
  2187. "~      x += y;            ~"
  2188. "~      break;             ~"
  2189. "~    case 4:              ~"
  2190. "~      x -= y;            ~"
  2191. "~      break;             ~"
  2192. "~    default:             ~"
  2193. "~      printf ("¡ERROR!");~"
  2194. "~  }                      ~"
  2195. endv
  2196. beginv
  2197. coordenadas_completas 36 5 80 23
  2198. cabecera " OBSERVACIONES "
  2199. "1) La sentencia default es opcional. Si"
  2200. "fallan todas las comprobaciones de los"
  2201. "case y no hay default, no se ejecuta"
  2202. "ninguna acción en el switch. Incluso el"
  2203. "default puede ir en cualquier posición"
  2204. "y no obligatoriamente al final."
  2205. ""
  2206. pulsación
  2207. "2) La sentencia switch se diferencia de"
  2208. "la escala if-else-if en dos cosas:"
  2209. ""
  2210. "  1º) En la sentencia switch sólo se"
  2211. "  puede comprobar la igualdad entre las"
  2212. "  expresiones constantes y expresión."
  2213. ""
  2214. "  2º) Las expresiones de los case han"
  2215. "  de ser constantes."
  2216. borrar_ventana
  2217. "3) Las sentencias break en el switch son"
  2218. "opcionales. El break hace que se produzca"
  2219. "una salida inmediata de la instrucción"
  2220. "switch. Si no hay una sentencia break en"
  2221. "un case, al ejecutarse las sentencias que"
  2222. "corresponden a ese case, también se eje-"
  2223. "cutarían las sentencias correspondientes"
  2224. "al siguiente case y así sucesivamente"
  2225. "hasta encontrar un break o llegar al fi-"
  2226. "nal del switch. La sentencia break puede"
  2227. "ir en cualquier sitio, no forzosamente"
  2228. "al final de las sentencias de los case."
  2229. "~case 1:  /* Ejemplo de case sin break  */~"
  2230. "~  x++;   /* Después de ejecutarse x++, */~"
  2231. "~case 2:  /* se ejecuta siempre y++     */~"
  2232. "~  y++;                                   ~"
  2233. "~  break;                                 ~"
  2234. borrar_ventana
  2235. "4) Asociado a cada case puede haber"
  2236. "ninguna, una o varias sentencias."
  2237. ""
  2238. "~case 1: /* case sin sentencias directas*/~"
  2239. "~case 2: /* case con dos sentencias */    ~"
  2240. "~  ++x;                                   ~"
  2241. "~  break;                                 ~"
  2242. ""
  2243. "~case 3:                                  ~"
  2244. "~  x++;                                   ~"
  2245. "~  break;                                 ~"
  2246. "~  y++;/*esta sentencia nunca se ejecuta*/~"
  2247. ""
  2248. "~case 4: /* case con tres sentencias */   ~"
  2249. "~  x++;                                   ~"
  2250. "~  y++;                                   ~"
  2251. "~  break;                                 ~"
  2252. endv
  2253. borrar_pantalla
  2254. beginv
  2255. color 14 4
  2256. cabecera " SENTENCIAS ITERATIVAS "
  2257. centrar_coordenadas
  2258. ""
  2259. "  Los bucles o sentencias iterativas  "
  2260. "  permiten que un conjunto de ins-"
  2261. "  trucciones sea ejecutado hasta que"
  2262. "  se alcance una cierta condición."
  2263. ""
  2264. "  Las sentencias iterativas son:"
  2265. "  ~while~, ~for~ y ~do~."
  2266. ""
  2267. endv
  2268. borrar_pantalla
  2269. beginv
  2270. color 15 1
  2271. coordenadas_completas 1 2 80 4
  2272. ""
  2273. "                              Sentencia while"
  2274. endv
  2275. beginv
  2276. color 15 2
  2277. cabecera " SINTAXIS "
  2278. coordenadas 3 6
  2279. no_sombra
  2280. ""
  2281. "  ~while (expresión)~  "
  2282. "  ~  sentencia      ~"
  2283. ""
  2284. endv
  2285. beginv
  2286. cabecera " DESCRIPCION "
  2287. coordenadas 30 5
  2288. no_sombra
  2289. "Se evalúa expresión. Si es cierta, se ejecuta"
  2290. "sentencia y se vuelve a evaluar expresión. El"
  2291. "ciclo continúa hasta que expresión es falsa,"
  2292. "momento en que la ejecución continúa con lo"
  2293. "que está después de sentencia."
  2294. endv
  2295. beginv
  2296. cabecera " EJEMPLOS "
  2297. centrar_coordenadas_x 13
  2298. "~ /*                  ~ ~ /*                          ~ ~ /*                   ~"
  2299. "~    el bucle termina ~ ~   imprime los cinco pri-    ~ ~   al ; del while no  ~"
  2300. "~    cuando encuentra ~ ~   meros números naturales   ~ ~   se llega nunca ya  ~"
  2301. "~    un carácter dis- ~ ~ */                          ~ ~   que el bucle no    ~"
  2302. "~    to de blanco en  ~ ~ i = 1;                      ~ ~   nace ninguna itera-~"
  2303. "~    vector s         ~ ~ while (i <= 5)              ~ ~   ción.              ~"
  2304. "~ */                  ~ ~   {                         ~ ~ */                   ~"
  2305. "~ i = 0;              ~ ~     printf ("\ni = %d", i); ~ ~   int condicion = 0; ~"
  2306. "~ while (s[i] == ' ') ~ ~     i++;                    ~ ~   while (condicion)  ~"
  2307. "~   i++;              ~ ~   }                         ~ ~     ;                ~"
  2308. endv
  2309. borrar_pantalla
  2310. beginv
  2311. color 15 1
  2312. coordenadas_completas 1 2 80 4
  2313. ""
  2314. "                               Sentencia for"
  2315. endv
  2316. beginv
  2317. color 15 2
  2318. cabecera " FORMA GENERAL "
  2319. no_sombra
  2320. centrar_coordenadas_x 5
  2321. ""
  2322. "  ~for (expresión_1; expresión_2; expresión_3)~  "
  2323. "  ~  sentencia                                ~"
  2324. ""
  2325. endv
  2326. beginv
  2327. cabecera " DESCRIPCION "
  2328. centrar_coordenadas_x 11
  2329. "En la sentencia for, a expresión_1 se le llama inicialización, a expresión_2"
  2330. "se le llama condición, y a expresión_3 se le llama incremento."
  2331. ""
  2332. "La forma general descrita de la sentencia for es equivalente a:"
  2333. "  ~expresión_1        ~"
  2334. "  ~while (expresión_2)~"
  2335. "  ~  {                ~       La forma de actuar del bucle for se observa"
  2336. "  ~    sentencia      ~       claramente en su equivalente del while."
  2337. "  ~    expresión_3;   ~"
  2338. "  ~  }                ~"
  2339. "Las tres expresiones de la sentencia for son opcionales, aunque los puntos y"
  2340. "coma siempre deben aparecer. Si no aparece expresión_2 se asume que es 1."
  2341. endv
  2342. beginv
  2343. cabecera " EJEMPLOS "
  2344. centrar_coordenadas_x 12
  2345. "~#include <stdio.h>                   ~ ~#include <stdio.h>                    ~"
  2346. "~void main (void)                     ~ ~void main (void)                      ~"
  2347. "~{                                    ~ ~{                                     ~"
  2348. "~  printf ("Lista de los 100 primeros"~ ~  int i, s;                           ~"
  2349. "~          "números naturales:\n);    ~ ~  for (s = 0, i = 1; i < 100; i++)    ~"
  2350. "~  int x;                             ~ ~    s += i;                           ~"
  2351. "~  for (x = 1; x <= 100; x++)         ~ ~  printf ("La suma de los primeros "  ~"
  2352. "~    printf ("%d ", x);               ~ ~    "100 números naturales es %d.",s);~"
  2353. "~}                                    ~ ~}                                     ~"
  2354. "Nota: (s = 0, i = 1) es una expresión, más concretamente, es una expresión"
  2355. "formada por el operador coma, cuyo operandos son expresiones de asignación."
  2356. endv
  2357. beginv
  2358. cabecera " OBSERVACION "
  2359. centrar_coordenadas_x 11
  2360. no_sombra
  2361. "La instrucción"
  2362. ""
  2363. "  ~for (;;)   ~"
  2364. "  ~  sentencia~"
  2365. ""
  2366. "es un bucle infinito."
  2367. ""
  2368. "Sin embargo, aunque en este bucle no nos podamos"
  2369. "salir por la condición del for, nos podemos salir"
  2370. "por otros medio (por ejemplo, mediante la sentencia"
  2371. "break, que estudiaremos un poco más adelante en"
  2372. "esta misma lección)."
  2373. endv
  2374. borrar_pantalla
  2375. beginv
  2376. color 15 1
  2377. coordenadas_completas 1 2 80 4
  2378. ""
  2379. "                                Sentencia do"
  2380. endv
  2381. beginv
  2382. color 15 2
  2383. cabecera " SINTAXIS "
  2384. coordenadas 3 5
  2385. no_sombra
  2386. ""
  2387. "  ~do                ~  "
  2388. "  ~  sentencia       ~  "
  2389. "  ~while (expresión);~  "
  2390. ""
  2391. endv
  2392. beginv
  2393. cabecera " DESCRIPCION "
  2394. coordenadas 32 5
  2395. no_sombra
  2396. "En la instrucción do, primero se ejecuta"
  2397. "sentencia y a continuación se evalúa ex-"
  2398. "presión. En caso de ser cierta, se ejecuta"
  2399. "sentencia de nuevo y así sucesivamente. La"
  2400. "iteración termina cuando la expresión se"
  2401. "convierte en falsa."
  2402. endv
  2403. beginv
  2404. cabecera " EJEMPLO "
  2405. coordenadas 1 10
  2406. no_sombra
  2407. "~/*                        ~"
  2408. "~   imprime los 50 primeros~"
  2409. "~   números naturales      ~"
  2410. "~*/                        ~"
  2411. "~#include <stdio.h>        ~"
  2412. "~void main (void)          ~"
  2413. "~{                         ~"
  2414. "~  int i = 1;              ~"
  2415. "~  do                      ~"
  2416. "~    {                     ~"
  2417. "~      printf ("%d ", i++);~"
  2418. "~    } while (i <= 50);    ~"
  2419. "~}                         ~"
  2420. endv
  2421. beginv
  2422. cabecera " OBSERVACION "
  2423. coordenadas 31 9
  2424. "Las llaves en el ejemplo anterior no son nece-"
  2425. "sarias al tratarse de una sola sentencia; pero"
  2426. "en el caso de la sentencia do, yo recomiendo"
  2427. "que siempre pongáis las llaves para hacer el"
  2428. "programa más legible (para el lector, no para"
  2429. "el compilador). Obsérvese la misma instrucción"
  2430. "sin llaves:"
  2431. "  ~i = 1;                ~"
  2432. "  ~do                    ~"
  2433. "  ~  printf ("%d ", i++);~"
  2434. "  ~while (i <= 50);      ~"
  2435. "Cuando un lector ve la línea del while, puede"
  2436. "pensar que se trata de la sentencia while,"
  2437. "cuando en realidad es la sentencia do-while."
  2438. endv
  2439. borrar_pantalla
  2440. partir
  2441. beginv
  2442. color 15 1
  2443. coordenadas_completas 1 2 80 4
  2444. borde 2 (necesario por partir)
  2445. ""
  2446. "                              Sentencia break"
  2447. endv
  2448. beginv
  2449. color 15 2
  2450. coordenadas 7 6
  2451. cabecera " SINTAXIS "
  2452. ""
  2453. "  ~break;~  "
  2454. ""
  2455. endv
  2456. beginv
  2457. coordenadas 31 6
  2458. cabecera " DESCRIPCION "
  2459. "Esta sentencia provoca la salida inmediata "
  2460. "de las sentencias switch, while, for y do."
  2461. "Por lo tanto, su uso sólo es correcto dentro"
  2462. "de un bloque de una estas sentencias."
  2463. endv
  2464. beginv
  2465. coordenadas 1 15
  2466. cabecera " EJEMPLO "
  2467. "~for (i = 0; i < 10; i++) ~"
  2468. "~  for (j = 0; j < i; j++)~"
  2469. "~    if (j == 5)          ~"
  2470. "~      break;             ~"
  2471. endv
  2472. beginv
  2473. coordenadas 31 14
  2474. cabecera " OBSERVACION "
  2475. "Una sentencia break obliga a una salida"
  2476. "inmediata del ciclo (o switch) más interior."
  2477. ""
  2478. "En el ejemplo anterior, la ejecución de la"
  2479. "sentencia break provoca una salida del bucle"
  2480. "for de la variable j, pero no tiene ningún"
  2481. "efecto sobre el bucle for de la variable i."
  2482. endv
  2483. borrar_pantalla
  2484. beginv
  2485. color 15 1
  2486. coordenadas_completas 1 2 80 4
  2487. ""
  2488. "                            Sentencia continue"
  2489. endv
  2490. beginv
  2491. color 15 2
  2492. cabecera " SINTAXIS "
  2493. coordenadas 1 6
  2494. no_sombra
  2495. ""
  2496. "  ~continue;~  "
  2497. ""
  2498. endv
  2499. beginv
  2500. cabecera " DESCRIPCION "
  2501. coordenadas 19 5
  2502. "La sentencia continue funciona de una forma algo similar"
  2503. "a break. En vez de forzar la terminación, continue fuerza"
  2504. "una nueva iteración del bucle y salta cualquier código que"
  2505. "exista entre medias."
  2506. endv
  2507. beginv
  2508. cabecera " EJEMPLO "
  2509. coordenadas 1 12
  2510. no_sombra
  2511. "~/*                                        ~"
  2512. "~  este bucle imprime todos los números no ~"
  2513. "~  negativos del vector vector_de_numeros  ~"
  2514. "~*/                                        ~"
  2515. "~for (i = 0; i < 100; i++)                 ~"
  2516. "~  {                                       ~"
  2517. "~    numero = vector_de_numeros [i];       ~"
  2518. "~    if (numero < 0)                       ~"
  2519. "~      continue;                           ~"
  2520. "~    printf ("%d ", vector_de_numeros [i]);~"
  2521. "~  }                                       ~"
  2522. endv
  2523. beginv
  2524. coordenadas 17 15
  2525. no_sombra
  2526. cabecera " OBSERVACION "
  2527. "En los ciclos while y do-while, una sentencia continue da"
  2528. "lugar a que el control pase directamente a la evaluación"
  2529. "de la condición y prosiga el proceso del bucle. En el caso"
  2530. "de un for, primero se ejecuta la parte incremento del bucle,"
  2531. "a continuación se ejecuta la evaluación de condición, y"
  2532. "finalmente el bucle prosigue."
  2533. endv
  2534. borrar_pantalla
  2535. beginv
  2536. color 15 1
  2537. coordenadas_completas 1 2 80 4
  2538. ""
  2539. "                              Sentencia goto"
  2540. endv
  2541. beginv
  2542. color 15 2
  2543. centrar_coordenadas_x 5
  2544. cabecera " SINTAXIS "
  2545. ""
  2546. "  ~goto etiqueta;~  "
  2547. ""
  2548. endv
  2549. beginv
  2550. centrar_coordenadas_x 9
  2551. cabecera " DESCRIPCION "
  2552. "El lenguaje C tiene la fatalmente seductora sentencia goto."
  2553. "La utilización de esta sentencia en un programa es una de"
  2554. "las mejores formas de hacerlo ilegible y difícilmente modi-"
  2555. "ficable."
  2556. ""
  2557. "La sentencia goto provoca un salto a una etiqueta que se"
  2558. "encuentra en la misma función. Una etiqueta es un identifi-"
  2559. "cador válido de C seguido por dos puntos."
  2560. endv
  2561. beginv
  2562. centrar_coordenadas_x 8
  2563. cabecera " EJEMPLO "
  2564. "~/*                                      ~"
  2565. "~  Programa que imprime los 100          ~"
  2566. "~  primeros números naturales.           ~"
  2567. "~*/                                      ~"
  2568. "~                                        ~"
  2569. "~#include <stdio.h>                      ~"
  2570. "~void main (void)                        ~"
  2571. "~{                                       ~"
  2572. "~  int x = 1;                            ~"
  2573. "~  bucle: /* etiqueta */                 ~"
  2574. "~    printf ("%d ", x++);                ~"
  2575. "~    if (x <= 100)                       ~"
  2576. "~      goto bucle; /* salto a etiqueta */~"
  2577. "~}                                       ~"
  2578. endv
  2579. borrar_pantalla
  2580. beginv
  2581. color 15 0
  2582. centrar_coordenadas
  2583. ""
  2584. "  En esta lección se ha estudiado todas las sentencias de control de"
  2585. "  programa que posee el C. Entre ellas se incluyen los constructores"
  2586. "  de bucles while, for y do, las sentencias condicionales if y switch;"
  2587. "  las sentencias break, continue y goto. Aunque técnicamente también"
  2588. "  la sentencia return afecta al flujo de control de un programa, no se  "
  2589. "  hará referencia a ella hasta la siguiente lección sobre funciones."
  2590. ""
  2591. pulsación
  2592. "  ~Consejo: No utilices las sentencias goto y continue a no ser que sea~"
  2593. "  ~absolutamente necesario en un programa; lo mismo digo para la sen-  ~"
  2594. "  ~tencia break siempre que no sea en un switch (en este caso es nece- ~"
  2595. "  ~sario). La utilización de estas sentencias disminuye la lectura de  ~"
  2596. "  ~un programa, además de que no hacen ninguna falta ya que el C es un ~"
  2597. "  ~lenguaje muy rico en sentencias, operadores y funciones. Yo he pro- ~"
  2598. "  ~gramado bastante en C y nunca he tenido la necesidad de utilizar    ~"
  2599. "  ~estas sentencias; un ejemplo es la programación de este tutor.      ~"
  2600. ""
  2601. endv
  2602. end lección 3
  2603.  
  2604. ; LECCION 4
  2605. begin
  2606. beginv
  2607. borde 2
  2608. color 1 7
  2609. centrar_coordenadas
  2610. cabecera " INTRODUCCION A LA LECCION 4 "
  2611. "~                                                                   ~"
  2612. "~ El objetivo de esta lección es describir algunas funciones del C. ~"
  2613. "~                                                                   ~"
  2614. ""
  2615. "Las funciones que detallaremos son:"
  2616. ""
  2617. "- Funciones de control de programa: ~exit ()~, ~_exit ()~, ~abort ()~ y"
  2618. "  ~assert ()~."
  2619. "- Funciones de E/S: ~printf ()~, ~scanf ()~, ~putchar ()~, ~getchar ()~,"
  2620. "  ~puts ()~ y ~gets ()~."
  2621. "- Funciones de consola: ~cprintf ()~, ~cscanf ()~, ~putch ()~, ~getch ()~,"
  2622. "  ~getche ()~, ~ungetch ()~, ~cputs ()~, ~cgets ()~ y ~kbhit ()~."
  2623. begint
  2624. "- Funciones de consola de Turbo C: ~lowvideo ()~, ~highvideo ()~ y"
  2625. "  ~normvideo ()~."
  2626. endt
  2627. ""
  2628. "También veremos la constante ~EOF~."
  2629. begint
  2630. ""
  2631. "En Turbo C se verá además dos constantes definidas en stdlib.h"
  2632. "(~EXIT_SUCCESS~ y ~EXIT_FAILURE~) y una variable definida en conio.h"
  2633. "(~directvideo~)."
  2634. endt
  2635. endv
  2636. borrar_pantalla
  2637. beginv
  2638. color 14 2
  2639. centrar_coordenadas_x 2
  2640. no_sombra
  2641. "FUNCIONES DE CONTROL DE PROGRAMA"
  2642. endv
  2643. beginv
  2644. color 14 1
  2645. centrar_coordenadas
  2646. no_sombra
  2647. ""
  2648. "  En la lección anterior hemos visto las"
  2649. ""
  2650. "  sentencias de control de programa: ~if~,"
  2651. ""
  2652. "  ~switch~, ~while~, ~for~, ~do~, ~break~, ~continue~"
  2653. ""
  2654. "  y ~goto~. A continuación vamos a ver las"
  2655. ""
  2656. "  funciones que pueden afectar al flujo de  "
  2657. ""
  2658. "  control de un programa; estas funciones"
  2659. ""
  2660. "  son: ~exit~, ~abort~ y ~assert~."
  2661. ""
  2662. endv
  2663. beginvis
  2664. coordenadas_completas 1 5 80 24
  2665. cabecera " FUNCIONES exit () y _exit ()"
  2666. color 14 1
  2667. borde 2
  2668. "~La función exit, que se encuentra declarada en la biblioteca estándar~"
  2669. "~(stdlib.h), da lugar a la terminación automática de un programa.~"
  2670. ""
  2671. "Al describir una función siempre hay que especificar los argumentos y"
  2672. "el valor que devuelve si los hay. La función exit no devuelve nada pero"
  2673. "necesita un argumento que es recogido por el programa llamador (normal-"
  2674. "mente el sistema operativo). Por convención, el valor 0 indica termina-"
  2675. "ción normal; valores distintos de 0 indican situaciones anormales."
  2676. ""
  2677. "En los programas que manipulan ficheros, éstos han de abrirse, manipularse"
  2678. "y cerrarse. Los datos de estos ficheros no se manipulan directamente sino"
  2679. "a través de unos almacenamientos temporales llamados buffers. La función"
  2680. "exit cierra todos los ficheros abiertos, vacía todos los buffers de salida,"
  2681. "y a continuación llama a la función _exit para terminar el programa. ~La~"
  2682. "~función _exit provoca la terminación inmediata del programa sin realizar el~"
  2683. "~vaciado de los buffers ni cerrar los ficheros~; si se desea se la puede lla-"
  2684. "mar directamente; el argumento de _exit es el mismo que para exit."
  2685. ""
  2686. "Ejemplo:"
  2687. ""
  2688. "~#include <stdlib.h> /* para poder utilizar la función exit () */"
  2689. "~"
  2690. "~/* las funciones tarjeta_color () y jugar () han de estar definidas en"
  2691. "~   algún lado */"
  2692. "~"
  2693. "~void main (void)"
  2694. "~{"
  2695. "~  /* tarjeta_color () es una función que devuelve 0 (falso) si la tarjeta"
  2696. "~     del sistema no es color y 1 (cierto) si lo es */"
  2697. "~  if (tarjeta_color ())"
  2698. "~    exit (1); /* terminación anormal: la tarjeta no es color */"
  2699. "~  jugar (); /* llamada a función para jugar */"
  2700. "~  exit (0); /* terminación normal, esta sentencia no es necesaria */"
  2701. "~}"
  2702. begint
  2703. ""
  2704. "En la librería stdlib de Turbo C hay dos constantes definidas para"
  2705. "pasárselas como argumento a la función exit:"
  2706. ""
  2707. "  ~EXIT_SUCCESS~ que tiene valor 0 y ~EXIT_FAILURE~ que tiene valor 1"
  2708. ""
  2709. "De este modo, si nos olvidamos si el argumento 0 de exit significa"
  2710. "terminación normal o anormal, utilizamos estas constantes que es más"
  2711. "difícil que se nos olvide. Además hace el programa más legible."
  2712. ""
  2713. "Ejemplos de utilización:"
  2714. ""
  2715. "  ~exit (EXIT_SUCCESS);~"
  2716. ""
  2717. "  ~exit (EXIT_FAILURE);~"
  2718. endt
  2719. endvis
  2720. beginvis
  2721. cabecera " FUNCION abort () "
  2722. coordenadas_completas 1 5 80 24
  2723. color 14 1
  2724. borde 2
  2725. "~La función abort aborta el programa.~ Es muy similar a la función exit."
  2726. ""
  2727. "Se diferencia de la función exit en dos aspectos fundamentales:"
  2728. ""
  2729. "1) La función abort no acepta ningún argumento. Se le llama de la siguiente"
  2730. "forma:"
  2731. ""
  2732. "  ~abort ();~"
  2733. ""
  2734. "2) La función abort no vacía los buffers ni cierra ningún fichero."
  2735. ""
  2736. "El principal uso de abort es prevenir una fuga del programa cerrando los"
  2737. "ficheros abiertos."
  2738. ""
  2739. "Esta función se encuentra declarada en el fichero: stdlib.h."
  2740. ""
  2741. "Cuando se desee terminar un programa inmediatamente es preferible intentar"
  2742. "utilizar la función exit."
  2743. endvis
  2744. beginvis
  2745. cabecera " FUNCION assert () "
  2746. coordenadas_completas 1 5 80 24
  2747. color 14 1
  2748. borde 2
  2749. "~La función assert no devuelve nada y acepta una expresión como argumento.~"
  2750. "~Esta función testea la expresión dada; si la expresión es cierta no hace ~"
  2751. "~nada; si la expresión es falsa escribe un mensaje en la salida de error  ~"
  2752. "~estándar y termina la ejecución del programa.                            ~"
  2753. ""
  2754. "El mensaje presentado es dependiente del compilador pero suele tener la"
  2755. "siguiente forma:"
  2756. ""
  2757. "  Expresión fallida: <expresión>, archivo <archivo>, línea <num_línea>"
  2758. ""
  2759. "La función assert se suele utilizar para verificar que el programa opera"
  2760. "correctamente."
  2761. ""
  2762. "Se encuentra declarada en el fichero: assert.h."
  2763. begint
  2764. ""
  2765. "En Turbo C, el mensaje presentado por la función assert es:"
  2766. "~Assertion failed: <expresión>, file <fichero>, line <num_línea>~"
  2767. "~Abnormal program termination~"
  2768. endt
  2769. ""
  2770. "Ejemplo:"
  2771. ""
  2772. "~#include <assert.h> /* para poder utilizar la función assert ()          ~"
  2773. "~                                                                         ~"
  2774. "~void main (void)                                                         ~"
  2775. "~{                                                                        ~"
  2776. "~  int x, y;                                                              ~"
  2777. "~  x = y = 1;                                                             ~"
  2778. "~  assert (x < y); /* la expresión x < y es falsa y el programa termina */~"
  2779. "~  x++; y++; /* estas dos sentencias nunca se ejecutan */                 ~"
  2780. "~}                                                                        ~"
  2781. endvis
  2782. borrar_pantalla
  2783. beginv
  2784. color 14 2
  2785. centrar_coordenadas_x 2
  2786. no_sombra
  2787. "FUNCIONES DE E/S"
  2788. endv
  2789. beginvis
  2790. coordenadas_completas 1 5 80 24
  2791. color 14 1
  2792. borde 2
  2793. "~Se llaman funciones de entrada/salida (input/output), abreviado funciones~"
  2794. "~de E/S (I/O), a aquéllas que transportan datos entre el programa y la    ~"
  2795. "~entrada y salida estándar.                                               ~"
  2796. ""
  2797. "La entrada estándar normalmente es el ~teclado~ y la salida estándar normal-"
  2798. "mente es la ~consola~. Mientras no se diga lo contrario, en este tutor se"
  2799. "considera la entrada estándar como el teclado y la salida estándar como la"
  2800. "consola."
  2801. ""
  2802. "El final de la entrada y salida se suele marcar (en el caso de ficheros de"
  2803. "texto ocurre siempre) con un carácter especial llamado Fin-De-Fichero y se"
  2804. "simboliza "EOF" (End-Of-File). Hay una constante definida en el fichero"
  2805. "stdio.h que se llama ~EOF~ y tiene el valor de -1. El carácter de fin de"
  2806. "fichero se suele escribir con CONTROL-Z (código ASCII 26) en el DOS y"
  2807. "CONTROL-D en UNIX. Algunas funciones del C (por ejemplo, scanf) devuelven"
  2808. "el valor de EOF cuando leen el carácter de marca de fin de fichero."
  2809. ""
  2810. "En las operaciones de E/S, los datos utilizados suelen pasar por buffers."
  2811. "Un ~buffer~ es una cantidad de memoria utilizada para meter y sacar datos."
  2812. ""
  2813. "Tras estos preliminares ya estamos en condiciones de ver las principales"
  2814. "funciones de E/S: ~printf~, ~scanf~, ~putchar~, ~getchar~, ~puts~ y ~gets~."
  2815. endvis
  2816. beginvis
  2817. cabecera " FUNCIONES printf () y scanf () "
  2818. coordenadas_completas 1 5 80 24
  2819. color 14 1
  2820. borde 2
  2821. "~La función printf escribe datos formateados en la salida estándar.~"
  2822. "~La función scanf lee datos formateados de la entrada estándar.    ~"
  2823. ""
  2824. "El término "con formato" se refiere al hecho de que estas funciones pueden"
  2825. "escribir y leer datos en varios formatos que están bajo su control."
  2826. ""
  2827. "Ambas funciones están declaradas en el fichero stdio.h, y tienen la forma"
  2828. "general:"
  2829. ""
  2830. "  ~printf ("cadena de control", lista de argumentos);~"
  2831. "  ~scanf ("cadena de control", lista de argumentos); ~"
  2832. ""
  2833. "La cadena de control está formada por caracteres imprimibles y códigos de"
  2834. "formato. Debe haber tantos códigos de formato como argumentos."
  2835. ""
  2836. "Los códigos u órdenes de formato son las siguientes:"
  2837. ""
  2838. " Código  Formato"
  2839. " ------  ------------------------------------------------------------------"
  2840. "   ~%c~    Simple carácter"
  2841. "   ~%d~    Entero decimal con signo"
  2842. "   ~%i~    Entero decimal con signo"
  2843. "   ~%e~    Punto flotante en notación científica: [-]d.ddd e [+/-]ddd"
  2844. "   ~%f~    Punto flotante en notación no científica: [-]dddd.ddd"
  2845. "   ~%g~    Usa %e o %f, el que sea más corto en longitud"
  2846. "   ~%o~    Entero octal sin signo"
  2847. "   ~%s~    Cadena de caracteres"
  2848. "   ~%u~    Entero decimal sin signo"
  2849. "   ~%x~    Entero hexadecimal sin signo"
  2850. "   ~%%~    Signo de tanto por ciento: %"
  2851. "   ~%p~    Puntero"
  2852. "   ~%n~    El argumento asociado debe ser un puntero a entero en el que se"
  2853. "         pone el número de caracteres impresos hasta ese momento"
  2854. ""
  2855. "Las órdenes de formato pueden tener modificadores. Estos modificadores van"
  2856. "entre el % y la letra identificativa del código. Si el modificador es un"
  2857. "~número~, especifica la anchura mínima en la que se escribe ese argumento."
  2858. "Si ese número empieza por ~0~, los espacios sobrantes (si los hay) de la"
  2859. "anchura mínima se rellenan con 0. Si ese número tiene ~parte real y parte~"
  2860. "~fraccionaria~, indica el número de dígitos de la parte real y de la parte"
  2861. "fraccionaria a imprimir en el caso de imprimir un número, o indica el número"
  2862. "mínimo y máximo a imprimir en el caso de imprimir una cadena de caracteres."
  2863. "Por defecto, la salida se justifica a la derecha en caso de que se especifi-"
  2864. "que anchura mínima; si el modificador es un ~número negativo~, la justifica-"
  2865. "ción se hará a la izquierda. Otros dos modificadores son las letras ~l~ y"
  2866. "~h~; el primero indica que se va a imprimir un long, y h indica que se va a"
  2867. "imprimir un short. En la explicación de los modificadores se ha hablado de"
  2868. "imprimir, es decir, hemos hablado del printf. Los modificadores de scanf son"
  2869. "los mismos."
  2870. ""
  2871. "Después de esta parrafada veamos unos ejemplos prácticos."
  2872. ""
  2873. "Ejemplos:"
  2874. "               Sentencia printf ()        Salida"
  2875. "              ---------------------   --------------"
  2876. "              (":%f:", 123.456)       :123.456001:"
  2877. "              (":%e:", 123.456)       :1.234560e+02:"
  2878. "              (":%g:", 123.456)       :123.456:"
  2879. "              (":%-2.5f:", 123.456)   :123.45600:"
  2880. "              (":%-5.2f:", 123.456)   :123.46:"
  2881. "              (":%5.5f:", 123.456)    :123.45600:"
  2882. "              (":%10s:", "hola")      :      hola:"
  2883. "              (":%-10s:", "hola")     :hola      :"
  2884. "              (":%2.3s:", "hola")     :hol:"
  2885. "              (":%x:", 15)            :f:"
  2886. "              (":%o:", 15)            :17:"
  2887. "              (":%05d:", 15)          :00015:"
  2888. "              (":abc:%n", &var_int)   :abc:"
  2889. "                                      (además la variable var_int toma el"
  2890. "                                      valor de 5)"
  2891. ""
  2892. begint
  2893. "Las órdenes de formato de Turbo C son un poco más rica que en el ANSI C:"
  2894. ""
  2895. ""
  2896. "▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  2897. " Especificadores de formato"
  2898. "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  2899. ""
  2900. "% [banderas] [width] [.prec] [F|N|h|l] type"
  2901. ""
  2902. ""
  2903. "▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  2904. " Especificador de formato "[bandera]""
  2905. "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  2906. ""
  2907. " [bandera] │ Acción"
  2908. "═══════════╪════════════════════════════════════════════════════════════════"
  2909. " (ninguna) │ Justificado a la derecha; rellenos con 0 o blancos a la izq."
  2910. "     -     │ Justificado a la izquierda; rellenos con espacios a la derecha"
  2911. "     +     │ Siempre empieza con + o -"
  2912. "  blanco   │ Imprime signo para valores negativos solamente"
  2913. "     #     │ Convierte usando forma alternativa"
  2914. ""
  2915. " Formas alternativas para la bandera #"
  2916. "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  2917. "──────────┬──────────────────────────────────────────────"
  2918. " c,s,d,i,u│ (no tiene efecto)"
  2919. " o        │ Los argumentos distintos de 0 empiezan con 0"
  2920. " x o X    │ Los argumentos empiezan con 0x o 0X"
  2921. " e, E, f  │ Siempre usa punto decimal"
  2922. " g o G    │ Igual que e, E, o f pero con ceros al final"
  2923. ""
  2924. ""
  2925. "▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  2926. " Especificador de formato "[anchura]""
  2927. "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  2928. ""
  2929. " [anchura] │ Acción"
  2930. "═══════════╪════════════════════════════════════════════════"
  2931. "     n     │ Anchura mínima, rellenos con blanco"
  2932. "    0n     │ Anchura mínima, rellenos con 0 a la izquierda"
  2933. "     *     │ El próximo argumento de la lista es la anchura"
  2934. ""
  2935. ""
  2936. "▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  2937. " Especificador de formato "[.prec]""
  2938. "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  2939. ""
  2940. "  [.prec]  │ Acción"
  2941. "═══════════╪══════════════════════════════════════════════════"
  2942. " (ninguna) │ Precisión por defecto"
  2943. "    .0     │ (d,i,o,u,x)               Precisión por defecto"
  2944. "           │ (e,E,f)                   Sin punto decimal"
  2945. "    .n     │ Al manos n caracteres"
  2946. "     *     │ El próximo argumento de la lista es la precisión"
  2947. ""
  2948. ""
  2949. "▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  2950. " Especificador de formato "[F|N|h|l]""
  2951. "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  2952. ""
  2953. " Modificador │ Cómo es interpretado el argumento"
  2954. "═════════════╪════════════════════════════════════════════════════"
  2955. "      F      │ ──────         el argumento es puntero far"
  2956. "      N      │ ──────         el argumento es puntero near"
  2957. "      h      │ d,i,o,u,x,X    el argumento es short int"
  2958. "      l      │ d,i,o,u,x,X    el argumento es long int"
  2959. "      l      │ e,E,f,g,G      el argumento es double (sólo scanf)"
  2960. "      L      │ e,E,f,g,G      el argumento es long double"
  2961. ""
  2962. ""
  2963. "▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  2964. " Especificador de formato "tipo""
  2965. "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  2966. "   tipo  │ Acción"
  2967. "═════════╪══════════════════════════════════════════════════════════════════"
  2968. "    d    │ signed   decimal int"
  2969. "    i    │ signed   decimal int"
  2970. "    o    │ unsigned octal   int"
  2971. "    u    │ unsigned decimal int"
  2972. "    x    │ En printf = unsigned hexadecimal int;"
  2973. "         │ en scanf = hexadecimal int"
  2974. "    X    │ En printf = unsigned hexadecimal int;"
  2975. "         │ en scanf = hexadecimal long"
  2976. "    f    │ Punto flotante [-]dddd.ddd"
  2977. "    e    │ Punto flotante [-]d.ddd e [+/-]ddd"
  2978. "    g    │ Formato e o f basado en la precisión"
  2979. "    E    │ Igual que e excepto E par exponente"
  2980. "    G    │ Igual que g excepto E para exponente"
  2981. "    c    │ Carácter simple"
  2982. "    s    │ Imprime caracteres terminados en '\0' or [.prec]"
  2983. "    %    │ El carácter %"
  2984. "    p    │ Puntero: near = YYYY; far = XXXX:YYYY"
  2985. "    n    │ Almacena número de caracteres escritos en la dirección apuntada"
  2986. "         │ por el argumento de entrada"
  2987. ""
  2988. ""
  2989. "Ejemplos:"
  2990. ""
  2991. "               Sentencia printf ()       Salida"
  2992. "              ----------------------   ----------"
  2993. "               ("%x", 2)                2"
  2994. "               ("%#x", 2)               0x2"
  2995. "               ("%#X", 2)               0X2"
  2996. "               ("%f", 1.2)              1.200000"
  2997. "               ("%g", 1.2)              1.2"
  2998. "               ("%#g", 1.2)             1.200000"
  2999. "               ("%*.*f", 5, 4, 1.2)     1.2000"
  3000. ""
  3001. endt
  3002. "Hay una diferencia muy importante entre los argumentos de printf y scanf."
  3003. "En printf los argumentos son expresiones pero en scanf los argumentos han"
  3004. "de ser direcciones de memoria (punteros)."
  3005. ""
  3006. "Los punteros se van a estudiar en una lección posterior. No obstante, ha-"
  3007. "blaremos en este momento un poco de ellos para saber utilizar la función"
  3008. "scanf."
  3009. ""
  3010. "Los punteros hemos dicho que son direcciones de memoria. Para obtener la"
  3011. "dirección de memoria de una variable es necesario aplicar el operador mo-"
  3012. "nario & (no confundirlo con el operador binario, que es el and entre bits)"
  3013. "de la siguiente forma:"
  3014. ""
  3015. "                                & variable"
  3016. ""
  3017. "Hay un tipo de variable un poco especial a este respecto, que son los vec-"
  3018. "tores (también llamados arrays), cuyo nombre es un puntero que apunta al"
  3019. "primer elemento del vector."
  3020. ""
  3021. ""
  3022. "Ahora mismo se pretende que entendamos cómo usar la función scanf, no los"
  3023. "punteros, que es tema de otra lección; por cierto, el tema de los punteros"
  3024. "es, quizás, una de los más difíciles del C."
  3025. ""
  3026. "Ejemplo de cómo usar la función scanf:"
  3027. ""
  3028. "~scanf ("%d %s %f", &variable_entera, cadena_de_caracteres, &variable_float);~"
  3029. ""
  3030. "Programa ejemplo:"
  3031. ""
  3032. "~/*                                                                        ~"
  3033. "~  Programa que lee números enteros de teclado hasta que se introduce un 0.~"
  3034. "~  El programa no es muy útil pero sí instructivo.                         ~"
  3035. "~*/                                                                        ~"
  3036. "~                                                                          ~"
  3037. "~#include <stdio.h> /* para poder utilizar la función scanf */             ~"
  3038. "~                                                                          ~"
  3039. "~void main (void)                                                          ~"
  3040. "~{                                                                         ~"
  3041. "~  int x;                                                                  ~"
  3042. "~  do                                                                      ~"
  3043. "~    {                                                                     ~"
  3044. "~      scanf ("%d", &x);                                                   ~"
  3045. "~    } while (x != 0);                                                     ~"
  3046. "~}                                                                         ~"
  3047. ""
  3048. "Las llamadas a funciones son expresiones y como el resultado de evaluar una"
  3049. "expresión es un valor (a no ser que el resultado de la expresión sea de tipo"
  3050. "void), las funciones pueden devolver valores y la llamada a esa función toma"
  3051. "el valor devuelto por la función."
  3052. ""
  3053. "Supóngamos que f() es una función que devuelve un entero, entonces, las"
  3054. "siguientes expresiones son correctas:"
  3055. ""
  3056. "  ~int x, y, z;       ~"
  3057. "  ~                   ~"
  3058. "  ~x = f ();          ~"
  3059. "  ~y = f () * 2;      ~"
  3060. "  ~f ();              ~"
  3061. "  ~(void) f ();       ~"
  3062. "  ~z = f () + f ();   ~"
  3063. "  ~if (f () < 0)      ~"
  3064. "  ~  printf ("ERROR");~"
  3065. ""
  3066. "La función printf devuelve un valor entero que contiene el número de"
  3067. "caracteres escritos. En caso de error, devuelve EOF."
  3068. ""
  3069. "La función scanf devuelve el número de campos que han sido asignados. Si"
  3070. "ocurre un error o se detecta el fin de fichero, se devuelve EOF."
  3071. ""
  3072. "Ejemplo:"
  3073. ""
  3074. "  ~if (scanf ("%u", &variable_unsigned) == EOF)                            ~"
  3075. "  ~  printf ("Error o Fin-De-Fichero al intentar leer un valor unsigned.");~"
  3076. ""
  3077. "Profundicemos un poco más en el estudio de la función scanf."
  3078. ""
  3079. "En la cadena de control de scanf se pueden distinguir tres elementos:"
  3080. ""
  3081. "  ~- Especificadores de formato.       ~"
  3082. "  ~- Caracteres con espacios en blanco.~"
  3083. "  ~- Caracteres sin espacios en blanco.~"
  3084. ""
  3085. "Sobre los especificadores de formato ya hemos hablado. Sin embargo, la"
  3086. "función scanf() tiene otro especial: Un ~*~ situado después del % y antes"
  3087. "del código de formato lee los datos del tipo especificado pero elimina su"
  3088. "asignación. Así, dada la entrada"
  3089. ""
  3090. "  2 4"
  3091. ""
  3092. "como respuesta a la función"
  3093. ""
  3094. "  scanf ("%*d%d", &x);"
  3095. ""
  3096. "asigna el valor 4 a la x y no el valor 2 que es descartado."
  3097. ""
  3098. "Un espacio en blanco en la cadena de control da lugar a que scanf() salte"
  3099. "uno o más espacios en blanco en el flujo de entrada. Un carácter blanco es"
  3100. "un espacio, un tabulador o un carácter de nueva línea. Esencialmente, un"
  3101. "carácter espacio en blanco en una cadena de control da lugar a que scanf()"
  3102. "lea, pero no guarde, cualquier número (incluido 0) de espacios en blanco"
  3103. "hasta el primer carácter no blanco."
  3104. ""
  3105. "Un carácter que no sea espacio en blanco lleva a scanf() a leer y eliminar"
  3106. "el carácter asociado. Por ejemplo, "%d,%d" da lugar a que scanf() lea pri-"
  3107. "mero un entero, entonces lea y descarte la coma, y finalmente lea otro en-"
  3108. "tero. Si el carácter especificado no se encuentra, scanf() termina."
  3109. endvis
  3110. beginvis
  3111. coordenadas_completas 1 5 80 24
  3112. cabecera " FUNCIONES putchar () y getchar () "
  3113. color 14 1
  3114. borde 2
  3115. "La función ~putchar~ escribe un carácter en la salida estándar."
  3116. "La función ~getchar~ escribe un carácter en la entrada estádar."
  3117. ""
  3118. "La función putchar necesita un argumento que es el carácter a escribir."
  3119. "La función getchar no recibe ningún argumento."
  3120. ""
  3121. "Ambas funciones devuelven, en caso de éxito, el carácter procesado (escrito"
  3122. "o leído), y en caso de error o fin de fichero, EOF."
  3123. ""
  3124. "Las instrucciones"
  3125. ""
  3126. "  ~char ch;        ~"
  3127. "  ~ch = getchar ();~"
  3128. "  ~putchar (ch);   ~"
  3129. ""
  3130. "hacen lo mismo que las instrucciones"
  3131. ""
  3132. "  ~char ch;           ~"
  3133. "  ~scanf ("%c", &ch); ~"
  3134. "  ~printf ("%c", &ch);~"
  3135. ""
  3136. "pero para escribir y leer caracteres simples se prefiere la primera forma."
  3137. "En notación C, las instrucciones del primer ejemplo se escriben:"
  3138. ""
  3139. "  ~putchar (getchar ());~"
  3140. ""
  3141. "puesto que es más eficiente."
  3142. ""
  3143. "Lo mismo se puede decir de las siguientes asignaciones:"
  3144. ""
  3145. "  x = x + 1;"
  3146. "  x = x + 2;"
  3147. ""
  3148. "que aunque sean correctas, no es estilo C y además son menos eficientes que"
  3149. "sus correspondientes en estilo C:"
  3150. ""
  3151. "  x++; /* o ++x; */"
  3152. "  x += 2; /* hacer dos veces: x++; x++; ya es menos eficiente que x += 2; */"
  3153. ""
  3154. "Veamos un programa en C:"
  3155. ""
  3156. "~/* fichero ejemplo.c */                                                  ~"
  3157. "~                                                                         ~"
  3158. "~#include <stdio.h> /* para poder utilizar: getchar (), putchar (), EOF */~"
  3159. "~                                                                         ~"
  3160. "~void main (void)                                                         ~"
  3161. "~{                                                                        ~"
  3162. "~  int ch;                                                                ~"
  3163. "~  while ((ch = getchar ()) != EOF)                                       ~"
  3164. "~    putchar (ch);                                                        ~"
  3165. "~}                                                                        ~"
  3166. ""
  3167. "Al ser el nombre del programa ejemplo.c, el nombre del fichero ejecutable"
  3168. "será ejemplo.exe."
  3169. ""
  3170. "Si se ejecuta el programa de la siguiente forma:"
  3171. ""
  3172. "  ~ejemplo~"
  3173. ""
  3174. "se leen caracteres de teclado y se escriben en pantalla. Se leen caracteres"
  3175. "hasta que se encuentra el carácter de marca de fin de fichero que en el DOS"
  3176. "se escribe con CONTROL-Z."
  3177. ""
  3178. "Si se ejecuta el programa con redirección:"
  3179. ""
  3180. "  ~ejemplo < fichero_fuente > fichero_destino~"
  3181. ""
  3182. "se produce una copia del fichero_fuente al fichero_destino."
  3183. ""
  3184. "Otro ejemplo de ejecución:"
  3185. ""
  3186. "  ~ejemplo >> fichero_destino~"
  3187. ""
  3188. "en este caso se leen caracteres de teclado y se añaden al fichero_destino."
  3189. ""
  3190. "Este programa no sólo es instructivo sino también útil; pero hay dos cosas"
  3191. "que merecen una explicación: la variable ch es int no char, y la condición"
  3192. "del while parece un poco extravagante."
  3193. ""
  3194. "Si ch se hubiese declarado como:"
  3195. ""
  3196. "  ~char ch;~"
  3197. ""
  3198. "ch es unsigned y sería un error el compararlo con EOF que vale -1."
  3199. ""
  3200. "Sí se podía haber declarado ch como:"
  3201. ""
  3202. "  ~signed char ch;~"
  3203. ""
  3204. "pero esto tiene el inconveniente de que ch está en el rango -128 a 127 y ch"
  3205. "no podría tomar los valores de los caracteres ASCII entre 128 y 255."
  3206. ""
  3207. "Así que siempre que manejen caracteres con las funciones de E/S es preferi-"
  3208. "ble declarar ch como entero:"
  3209. ""
  3210. "  ~int ch;~"
  3211. ""
  3212. "El bucle while"
  3213. ""
  3214. "  ~while ((ch = getchar ()) != EOF)~"
  3215. "  ~  putchar (ch);                 ~"
  3216. ""
  3217. "puede parecer un poco raro pero es la forma de leer caracteres en C hasta"
  3218. "que se encuentra el caracter EOF. Los paréntesis son necesarios puesto que"
  3219. "los operadores de asignación son los penúltimos con menos precedencia (el"
  3220. "operador, es el que tiene menos preferencia) y si no se incluyeran en el"
  3221. "while anterior, primero se ejecutaría la comparación != y el resultado de"
  3222. "esta comparación (1 ó 0) se asignaría a la variable ch."
  3223. endvis
  3224. beginvis
  3225. coordenadas_completas 1 5 80 24
  3226. cabecera " FUNCIONES puts () y gets () "
  3227. color 14 1
  3228. borde 2
  3229. "La función ~puts~ escribe una cadena de caracteres y un carácter de nueva"
  3230. "línea al final de la cadena en la salida estándar."
  3231. "La función ~gets~ lee una cadena de caracteres de la entrada estándar hasta"
  3232. "que se encuentra el carácter '\n', aunque este carácter no es añadido a la"
  3233. "cadena."
  3234. ""
  3235. "La función puts acepta como argumento una cadena (sin formato). Si tiene"
  3236. "éxito devuelve el último carácter escrito (siempre es '\n'). En otro caso,"
  3237. "devuelve EOF."
  3238. ""
  3239. "La llamada a función"
  3240. ""
  3241. "  ~puts ("Esto es un ejemplo.");~"
  3242. ""
  3243. "es equivalente a:"
  3244. ""
  3245. "  ~printf ("Esto es un ejemplo.\n");~"
  3246. ""
  3247. "La función gets acepta como argumento un puntero al principio de la cadena,"
  3248. "es decir, el nombre de la variable cadena de caracteres; y devuelve dicho"
  3249. "puntero si tiene éxito o la constante NULL si falla."
  3250. ""
  3251. "NULL es una constante definida en el fichero stdio.h que tiene valor 0. Esta"
  3252. "constante se suele utilizar para denotar que un puntero no apunta a ningún"
  3253. "sitio."
  3254. ""
  3255. "Las instrucciones"
  3256. ""
  3257. "  ~char cadena [100];~"
  3258. "  ~gets (cadena);    ~"
  3259. ""
  3260. "no son equivalentes a"
  3261. ""
  3262. "  ~char cadena [100];   ~"
  3263. "  ~scanf ("%s", cadena);~"
  3264. ""
  3265. "puesto que gets lee una cadena hasta que encuentre '\n' y scanf hasta que"
  3266. "encuentre un carácter blanco (' '), un tabulador ('\t') o un carácter de"
  3267. "nueva línea ('\n')."
  3268. ""
  3269. "Con las funciones de lectura de cadenas es necesario tener una precaución"
  3270. "muy importante: en la declaración de cadena se ha reservado memoria para"
  3271. "100 caracteres; por lo tanto, si la función gets o scanf leen más de 100"
  3272. "caracteres, los caracteres a partir del 100 se están escribiendo en memoria"
  3273. "en posiciones no reservadas con lo cual los resultados son impredecibles:"
  3274. "pensad que se puede estar escribiendo datos en el código del sistema opera-"
  3275. "tivo, del compilador de C, de programas residentes, ..."
  3276. ""
  3277. "Este problema se puede solucionar con la función scanf de la siguiente"
  3278. "forma:"
  3279. ""
  3280. "  ~char cadena [100];      ~"
  3281. "  ~scanf ("%100s", cadena);~"
  3282. ""
  3283. "donde los caracteres introducidos a partir del número 100 son ignorados y"
  3284. "no se escriben en la variable cadena. Con la función gets no se puede hacer"
  3285. "esto."
  3286. endvis
  3287. borrar_pantalla
  3288. partir
  3289. beginv
  3290. color 14 2
  3291. centrar_coordenadas_x 2
  3292. no_sombra
  3293. borde 2 (necesario debido a partir)
  3294. "FUNCIONES DE CONSOLA"
  3295. endv
  3296. beginvis
  3297. coordenadas_completas 1 5 80 24
  3298. color 14 1
  3299. borde 2
  3300. "Las funciones de consola que vamos a describir no están definidas en el"
  3301. "estándar ANSI, ya que son funciones, que por su propia naturaleza, dependen"
  3302. "del entorno fijado y en gran parte no son portables. Sin embargo, estos"
  3303. "tipos de funciones tienen una importancia primordial a la hora de crear"
  3304. "un software de calidad."
  3305. ""
  3306. "Todo lo que se diga sobre estas funciones es válido para los dos compila-"
  3307. "dores de C más importantes: el de Microsoft y el de Borland. Si utilizas"
  3308. "otro compilador distinto a los anteriores, es probable que los nombres de"
  3309. "las funciones coincidan con las que vamos a ver, en caso contrario, estas"
  3310. "funciones tendrán otros nombres."
  3311. ""
  3312. "Las características de consola específicas de Borland sólo se estudiará si"
  3313. "la opción turbo está on."
  3314. ""
  3315. "Todas las funciones, y en general toda la información, de consola, están"
  3316. "recogidas en la librería ~<conio.h>~ (consola input/output)."
  3317. ""
  3318. "En esta lección vamos a ver diez funciones de esta librería: ~cprintf~,"
  3319. "~cscanf~, ~putch~, ~getch~, ~getche~, ~ungetch~, ~cputs~, ~cgets~ y ~kbhit~."
  3320. ""
  3321. begint
  3322. "Además veremos tres funciones más, que pertenecen a Turbo C: ~lowvideo~,"
  3323. "~higvideo~ y ~normvideo~."
  3324. ""
  3325. endt
  3326. "La función cprintf es similar a la función printf. Lo mismo sucede con los"
  3327. "pares de funciones: cscanf-scanf, cputs-puts, putch-putchar, getch-getchar,"
  3328. "getche-getchar, cputs-puts y cgets-gets."
  3329. ""
  3330. "Las diferencias entre estos pares de funciones se muestran en la tabla:"
  3331. ""
  3332. " ~   Funciones de E/S estándar      ~  ~      Funciones de E/S de consola     ~"
  3333. " ~----------------------------------~  ~--------------------------------------~"
  3334. " ~- Se escribe en la salida estádar ~  ~- Se escribe en pantalla              ~"
  3335. " ~- Se lee de la salida estándar    ~  ~- Se lee de teclado                   ~"
  3336. " ~- Se escribe y lee a través de    ~  ~- No utiliza buffers                  ~"
  3337. " ~  buffers                         ~  ~                                      ~"
  3338. " ~- Para pasar a la línea siguiente,~  ~- Para pasar a la línea siguiente hay ~"
  3339. " ~  es suficiente escribir el carác-~  ~  que escribir los caracteres de nueva~"
  3340. " ~  ter de nueva línea: '\n'        ~  ~  línea y el de retorno de carro: '\n'~"
  3341. " ~                                  ~  ~  y '\r'                              ~"
  3342. ""
  3343. "Consecuencia de estas diferencias:"
  3344. ""
  3345. "1) Las funciones de escritura de conio.h siempre escriben en pantalla. Las"
  3346. "   funciones de escritura de stdio.h normalmente escriben en pantalla, pero"
  3347. "   si se redirige la salida (esto se puede hacer al ejecutar el programa"
  3348. "   mediante los símbolos >, >> o |) ya no escribe en pantalla. Lo mismo se"
  3349. "   puede decir de las funciones de lectura y el teclado."
  3350. ""
  3351. "2) En los programas interactivos no queda bien trabajar con buffers. Si has"
  3352. "   visto los ejemplos de lecciones anteriores, getchar lee un carácter, pero"
  3353. "   lo lee una vez que se ha pulsado la tecla RETURN; además lo caracteres"
  3354. "   leídos hasta pulsar la tecla RETURN se mantienen en el buffer para ser"
  3355. "   leídos posteriormente. Esto queda muy mal en los programas interactivos."
  3356. "   Las funciones getch y getche, que las estudiaremos un poco más adelante,"
  3357. "   lee caracteres inmediatamente, es decir, tras pulsar la tecla."
  3358. ""
  3359. "3) Las funciones de escritura estándar siempre escriben en pantalla con los"
  3360. "   colores blanco sobre negro. Las funciones de escritura de consola escriben"
  3361. "   con cualquier atributo de pantalla."
  3362. endvis
  3363. beginvis
  3364. coordenadas_completas 1 5 80 24
  3365. color 14 1
  3366. borde 2
  3367. cabecera " FUNCIONES cprintf () y cscanf () "
  3368. "Estas dos funciones son exactamente iguales que sus correspondientes printf"
  3369. "y scanf. Sólo se diferencia en dos cosas:"
  3370. ""
  3371. "  1) La función cprintf escribe en pantalla en la posición actual del cursor"
  3372. "  y con el atributo de pantalla actual. La función cscanf lee de teclado."
  3373. ""
  3374. "  2) En la función cprintf, para pasar a la línea siguiente, es necesario"
  3375. "  escribir dos caracteres: '\n' y '\r'."
  3376. ""
  3377. "Estas dos diferencias ocurren con todas las funciones de entrada y salida de"
  3378. "conio.h."
  3379. ""
  3380. "Ejemplo:"
  3381. "  cprintf ("Pasando al principio de la línea siguiente\n\r");"
  3382. begint
  3383. ""
  3384. "En la librería conio.h de Turbo C existe una variable de tipo entera que se"
  3385. "llama ~directvideo~. Esta variable controla la salida: si directvideo tiene"
  3386. "el valor 1, la salida va directamente a RAM de vídeo; si tiene el valor 0,"
  3387. "la salida se escribe vía llamadas a la ROM BIOS. El valor por defecto es"
  3388. "directvideo = 1. Un valor de 1 hace la escritura más rápida pero menos"
  3389. "portable."
  3390. ""
  3391. "Ejemplo:"
  3392. ""
  3393. "  ~#include <conio.h> /* directvideo: sólo Turbo C */                 ~"
  3394. "  ~#include <stdio.h> /* puts () */                                   ~"
  3395. "  ~                                                                   ~"
  3396. "  ~void main (void)                                                   ~"
  3397. "  ~{                                                                  ~"
  3398. "  ~  directvideo = 0;                                                 ~"
  3399. "  ~  puts ("Este mensaje se escribe vía llamadas a la ROM BIOS.");    ~"
  3400. "  ~  directvideo = 1;                                                 ~"
  3401. "  ~  puts ("Este mensaje se escribe directamente a la RAM de vídeo.");~"
  3402. "  ~}                                                                  ~"
  3403. endt
  3404. endvis
  3405. beginvis
  3406. coordenadas_completas 1 5 80 24
  3407. color 14 1
  3408. borde 2
  3409. cabecera " FUNCIONES cputs () y cgets () "
  3410. "~La función cputs escribe una cadena de caracteres en pantalla.~ Si recuerdas,"
  3411. "las función puts escribía una cadena y además un caracter de nueva línea; la"
  3412. "función cputs no pasa a la línea siguiente a no ser que se encuentre en la"
  3413. "cadena los caracteres de nueva línea y retorno de carro. La función cputs,"
  3414. "al igual que la función puts, devuelve el último caracter escrito."
  3415. ""
  3416. "~La función cgets lee una cadena de caracteres de consola.~ Esta función es"
  3417. "un poco diferente a la función gets. El primer elemento de la cadena debe"
  3418. "contener la longitud máxima de la cadena a ser leída. La función cgets de-"
  3419. "vuelve en el segundo elemento de la cadena el número de caracteres leídos."
  3420. "La cadena empieza en el tercer elemento del array. Devuelve la dirección"
  3421. "del tercer elemento del array, que es donde empieza la cadena leída."
  3422. ""
  3423. "Veamos un ejemplo de la función cgets:"
  3424. ""
  3425. "~#include <conio.h> /* para poder utilizar las funciones cputs (),"
  3426. "~                      cgets (), cprintf () y getch () */"
  3427. "~"
  3428. "~void main (void)"
  3429. "~{"
  3430. "~  char cadena[83]; /* cadena[0], cadena[1] y 80 caracteres más el"
  3431. "~                      carácter terminador nulo */"
  3432. "~"
  3433. "~  cadena[0] = 81; /* la función cgets almacenará en cadena, como máximo,"
  3434. "~                     80 caracteres más el carácter nulo */"
  3435. "~"
  3436. "~  cputs ("Escribe una cadena de caracteres:\n\r");"
  3437. "~  cgets (cadena); /* lee cadena de consola */"
  3438. "~"
  3439. "~  cprintf ("\n\n\rNúmero de caracteres leídos: %d", cadena[1]);"
  3440. "~  cprintf ("\n\rCadena leída:\n\r %s", &cadena[2]); /* &cadena[2] es la"
  3441. "~                       dirección del tercer elemento del array cadena */"
  3442. "~"
  3443. "~  cputs ("\n\n\rPulsa cualquier tecla para finalizar el programa.");"
  3444. "~  getch ();"
  3445. "~}"
  3446. endvis
  3447. beginvis
  3448. coordenadas_completas 1 5 80 24
  3449. color 14 1
  3450. borde 2
  3451. no_posicion
  3452. cabecera " FUNCIONES putch (), getch (), getche () y ungetch () "
  3453. "~La función putch escribe un carácter en consola. Es similar a putchar.~"
  3454. ""
  3455. "~Las funciones getch y getche leen un carácter de consola, con eco a pantalla~"
  3456. "~(getche) o sin eco (getch). Son similares a getchar.~"
  3457. ""
  3458. "Las teclas especiales, tales como las teclas de función, están representadas"
  3459. "por una secuencia de dos caracteres: un carácter cero seguido del código de"
  3460. "exploración de la tecla presionada. Así, para leer un caracter especial, es"
  3461. "necesario ejecutar dos veces la función getch (o getche)."
  3462. ""
  3463. "~La función ungetch devuelve un carácter al teclado.~ Acepta como parámetro"
  3464. "el carácter a devolver y devuelve el propio carácter si hace la operación"
  3465. "con éxito o EOF se ha ocurrido un error."
  3466. ""
  3467. "Si hace ungetch, la próxima llamada de getch o cualquier otra función de"
  3468. "entrada por teclado, leerá el carácter que devolvió la función ungetch."
  3469. "No se puede devolver más de un carácter consecutivo."
  3470. ""
  3471. "Ejemplo:"
  3472. ""
  3473. "  ~#include <conio.h>                ~"
  3474. "  ~                                  ~"
  3475. "  ~void main (void)                  ~"
  3476. "  ~{                                 ~"
  3477. "  ~   char ch = 0;                   ~"
  3478. "  ~                                  ~"
  3479. "  ~   cprintf ("Entra una cadena: ");~"
  3480. "  ~   while (ch != '\r')             ~"
  3481. "  ~     {                            ~"
  3482. "  ~       ch = getch ();             ~"
  3483. "  ~       putch (ch);                ~"
  3484. "  ~     }                            ~"
  3485. "  ~}                                 ~"
  3486. endvis
  3487. beginvis
  3488. coordenadas_completas 1 5 80 24
  3489. color 14 1
  3490. borde 2
  3491. cabecera " FUNCION kbhit () "
  3492. "~La función kbhit devuelve un valor cierto (distinto de cero) si hay una~"
  3493. "~tecla disponible y falso (0) si no la hay.~"
  3494. ""
  3495. "Ejemplo:"
  3496. ""
  3497. "~#include <conio.h> /* para utilizar: cprintf (), kbhit (), getch () */      ~"
  3498. "~                                                                            ~"
  3499. "~void main (void)                                                            ~"
  3500. "~{                                                                           ~"
  3501. "~  float numero = 0;                                                         ~"
  3502. "~                                                                            ~"
  3503. "~  cprintf ("Pulsa cualquier tecla para parar la escritura de números.\n\r");~"
  3504. "~  while (! kbhit ())                                                        ~"
  3505. "~    cprintf ("\r%g", ++numero);                                             ~"
  3506. "~  cprintf ("\n\rTecla pulsada: %c.\n\r", getch ());                         ~"
  3507. "~                                                                            ~"
  3508. "~  cprintf ("\n\rPulsa cualquier tecla para finalizar.");                    ~"
  3509. "~  getch ();                                                                 ~"
  3510. "~}                                                                           ~"
  3511. endvis
  3512. begint
  3513. beginvis
  3514. coordenadas_completas 1 5 80 24
  3515. color 14 1
  3516. borde 2
  3517. no_posicion
  3518. cabecera " FUNCIONES lowvideo (), highvideo () y normvideo () "
  3519. "Estas tres funciones pertenecen a Turbo C."
  3520. ""
  3521. "~La función lowvideo hace que los caracteres que se escriban a partir de la~"
  3522. "~llamada a esta función se escriban en baja intensidad.~"
  3523. ""
  3524. "~La función highvideo hace que los caracteres que se escriban a partir de la~"
  3525. "~llamada a esta función se escriban en alta intensidad.~"
  3526. ""
  3527. "~La función normvideo hace que los caracteres que se escriban a partir de la~"
  3528. "~llamada a esta función se escriban en intensidad normal.~"
  3529. ""
  3530. "Ejemplo:"
  3531. ""
  3532. "~#include <conio.h> /* para utilizar lowvideo(), hihgvideo() y normvideo() */~"
  3533. "~                                                                            ~"
  3534. "~void main (void)                                                            ~"
  3535. "~{                                                                           ~"
  3536. "~  normvideo ();                                                             ~"
  3537. "~  cputs ("Texto con intensidad normal.");                                   ~"
  3538. "~  lowvideo ();                                                              ~"
  3539. "~  cputs ("Texto con baja intensidad.");                                     ~"
  3540. "~  highvideo ();                                                             ~"
  3541. "~  cputs ("Texto con alta intensidad.");                                     ~"
  3542. "~}                                                                           ~"
  3543. endvis
  3544. borrar_pantalla
  3545. endt
  3546. beginv
  3547. centrar_coordenadas_x 2
  3548. color 4 2
  3549. borde 2
  3550. "~RESUMEN DE LO QUE HEMOS VISTO EN ESTA LECCION~"
  3551. endv
  3552. beginv
  3553. centrar_coordenadas_y 7
  3554. borde 1
  3555. "exit ()"
  3556. "_exit ()"
  3557. "abort ()"
  3558. "assert ()"
  3559. begint
  3560. "EXIT_SUCCESS"
  3561. "EXIT_FAILURE"
  3562. endt
  3563. endv
  3564. beginv
  3565. centrar_coordenadas_y 30
  3566. "EOF"
  3567. "printf ()"
  3568. "scanf ()"
  3569. "códigos de formato"
  3570. "putchar ()"
  3571. "getchar ()"
  3572. "puts ()"
  3573. "gets ()"
  3574. endv
  3575. beginv
  3576. centrar_coordenadas_y 59
  3577. "cprintf ()"
  3578. "cscanf ()"
  3579. "putch ()"
  3580. "getch ()"
  3581. "getche ()"
  3582. "ungetch ()"
  3583. "cputs ()"
  3584. "cgets ()"
  3585. "kbhit ()"
  3586. begint
  3587. "directvideo"
  3588. "lowvideo ()"
  3589. "highvideo ()"
  3590. "normvideo ()"
  3591. endt
  3592. endv
  3593. end lección 4
  3594.  
  3595. ; LECCION 5
  3596. begin
  3597. beginv
  3598. borde 2
  3599. color 1 7
  3600. centrar_coordenadas
  3601. cabecera " INTRODUCCION A LA LECCION 5 "
  3602. "~                                                                          ~"
  3603. "~ El objetivo de esta lección es hacer un estudio completo en todo lo re-  ~"
  3604. "~ ferente a las variables, funciones, y directivas del preprocesador del C.~"
  3605. "~                                                                          ~"
  3606. "Los puntos que detallaremos son:"
  3607. "  - Declaración y definición de variables y funciones."
  3608. "  - Tipos de variables según el lugar de la declaración: variables loca-"
  3609. "    les, parámetros formales y variables globales."
  3610. "  - Especificadores de clase de almacenamiento: ~extern~, ~static~, ~register~"
  3611. "    y ~auto~."
  3612. "  - Reglas de ámbito de las funciones."
  3613. "  - Argumentos de las funciones en general y de la función main en parti-"
  3614. "    ticular."
  3615. "  - Recursividad."
  3616. "  - Separación de un programa en varios ficheros."
  3617. "  - Número variable de argumentos. Librería ~<stdarg.h>~: ~va_list~, ~va_arg()~,"
  3618. "    ~va_start()~ y ~va_end()~. Librería ~<stdio.h>~: ~vprintf()~ y ~vscanf()~."
  3619. "  - Directivas del preprocesador: ~#include~, ~#define~, ~#undef~, ~#error~, ~#if~,"
  3620. "    ~#else~, ~#elif~, ~#endif~, ~#ifdef~, ~#ifndef~, ~#line~ y ~#pragma~."
  3621. endv
  3622. borrar_pantalla
  3623. beginv
  3624. cabecera " FUNCIONES "
  3625. color 7 1
  3626. coordenadas_completas 1 2 80 5
  3627. "Los programas en C, al menos que sean muy simples, en cuyo caso estarían"
  3628. "compuestos sólo por la función main, están formados por varias funciones."
  3629. endv
  3630. beginvis
  3631. cabecera " DECLARACION DE FUNCIONES "
  3632. color 14 1
  3633. borde 2
  3634. coordenadas_completas 1 6 80 24
  3635. "La forma general de una función en el estándar ANSI actual es:"
  3636. ""
  3637. "~especificador_de_tipo nombre_de_la_funcion (lista_de_declaraciones_de_param)~"
  3638. "~{                                                                           ~"
  3639. "~  cuerpo_de_la_funcion                                                      ~"
  3640. "~}                                                                           ~"
  3641. ""
  3642. "y en el C de Kernighan y Ritchie es:"
  3643. ""
  3644. "~especificador_de_tipo nombre_de_la_funcion (lista_de_parametros)            ~"
  3645. "~declaracion_de_los_parametros                                               ~"
  3646. "~{                                                                           ~"
  3647. "~  cuerpo_de_la_funcion                                                      ~"
  3648. "~}                                                                           ~"
  3649. ""
  3650. "especificador_de_tipo es el tipo del valor que devuelve la función, si es"
  3651. "void, la función no devuelve ningún valor, si no se pone se supone que la"
  3652. "función devuelve un entero; lista_de_declaraciones_de_param es una lista"
  3653. "de declaraciones separadas por comas donde cada declaración consta de tipo"
  3654. "y nombre de parámetro; cuerpo_de_la_funcion es una lista de sentencias C,"
  3655. "incluso puede no haber ninguna: 'nada () {}' en cuyo caso la función no"
  3656. "hace nada (será útil como un lugar vacío durante el desarrollo de un pro-"
  3657. "grama); lista_de_parametros es una lista de nombres de parámetros separa-"
  3658. "dos por comas; declaracion_de_los_parametros consiste en especificar el"
  3659. "tipo de los parámetros."
  3660. ""
  3661. "La segunda forma aunque está permitida en el ANSI C es considerada como"
  3662. "obsoleta. De hecho, las palabras claves void, const y volatile vistas ya,"
  3663. "no existen en el viejo C de Kernighan y Ritchie."
  3664. ""
  3665. "Veamos un ejemplo:"
  3666. ""
  3667. "~  #include <stdio.h>"
  3668. "~"
  3669. "~  /* Función declarada según la forma del estándar ANSI */"
  3670. "~  void funcion_1 (int numero_1_funcion_1, int numero_2_funcion_1)"
  3671. "~  {"
  3672. "~    printf ("\n%d + %d = %d", numero_1_funcion_1, numero_2_funcion_1,"
  3673. "~            numero_1_funcion_1 + numero_2_funcion_1);"
  3674. "~  }"
  3675. "~"
  3676. "~  /* Función declarada según la forma del C de Kernighan y Ritchie */"
  3677. "~  void funcion_2 (numero_1_funcion_2, numero_2_funcion_2)"
  3678. "~  int numero_1_funcion_2, numero_2_funcion_2;"
  3679. "~  {"
  3680. "~    printf ("\n%d - %d = %d", numero_1_funcion_2, numero_2_funcion_2,"
  3681. "~            numero_1_funcion_2 - numero_2_funcion_2);"
  3682. "~  }"
  3683. "~"
  3684. "~  void main (void)"
  3685. "~  {"
  3686. "~    int numero_1_funcion_main = 2, numero_2_funcion_main = 3;"
  3687. "~    funcion_1 (numero_1_funcion_main, numero_2_funcion_main);"
  3688. "~    funcion_1 (numero_1_funcion_main, numero_2_funcion_main);"
  3689. "~  }"
  3690. ""
  3691. "La salida de este programa es:"
  3692. ""
  3693. "~2 + 3 = 5~"
  3694. "~2 - 3 = -1~"
  3695. ""
  3696. "El funcionamiento de este ejemplo parace claro. Hay una observación impor-"
  3697. "tante que hacer acerca del mismo: Si la función main se hubiera definido"
  3698. "antes de las funciones funcion_1 y funcion_2, el compilador al procesar"
  3699. "las llamadas a funcion_1 y funcion_2 no sabe de qué tipo son dichas funcio-"
  3700. "nes y nos puede informar de un error o asumir que devuelven un entero. Es"
  3701. "bueno declarar todas las funciones a utilizar (excepto main) antes de su"
  3702. "definición para evitar problemas de este tipo."
  3703. ""
  3704. "El ejemplo anterior se escribiría de la siguiente forma:"
  3705. ""
  3706. ""
  3707. "~  #include <stdio.h>"
  3708. "~"
  3709. "~  void funcion_1 (int numero_1_funcion_1, int numero_2_funcion_1);"
  3710. "~  void funcion_2 (int numero_1_funcion_2, int numero_2_funcion_2);"
  3711. "~"
  3712. "~  void main (void)"
  3713. "~  {"
  3714. "~    int numero_1_funcion_main = 2, numero_2_funcion_main = 3;"
  3715. "~    funcion_1 (numero_1_funcion_main, numero_2_funcion_main);"
  3716. "~    funcion_1 (numero_1_funcion_main, numero_2_funcion_main);"
  3717. "~  }"
  3718. "~"
  3719. "~  /* Función declarada según la forma del estándar ANSI */"
  3720. "~  void funcion_1 (int numero_1_funcion_1, int numero_2_funcion_1)"
  3721. "~  {"
  3722. "~    printf ("\n%d + %d = %d", numero_1_funcion_1, numero_2_funcion_1,"
  3723. "~            numero_1_funcion_1 + numero_2_funcion_1);"
  3724. "~  }"
  3725. "~"
  3726. "~  /* Función declarada según la forma del C de Kernighan y Ritchie */"
  3727. "~  void funcion_2 (numero_1_funcion_2, numero_2_funcion_2)"
  3728. "~  int numero_1_funcion_2, numero_2_funcion_2;"
  3729. "~  {"
  3730. "~    printf ("\n%d - %d = %d", numero_1_funcion_2, numero_2_funcion_2,"
  3731. "~            numero_1_funcion_2 - numero_2_funcion_2);"
  3732. "~  }"
  3733. ""
  3734. "El compilador, en esta nueva versión, al procesar las llamadas a las fun-"
  3735. "ciones funcion_1 y funcion_2 en la función main ya sabe cómo son estas"
  3736. "funciones."
  3737. ""
  3738. "En las declaraciones (no en las definiciones que son las descripciones"
  3739. "completas de las funciones) es lícito suprimir el nombre de los parámetros,"
  3740. "así que también se podría haber hecho:"
  3741. ""
  3742. "  ~void funcion_1 (int, int);~"
  3743. "  ~void funcion_2 (int, int);~"
  3744. ""
  3745. "e incluso también:"
  3746. ""
  3747. "  ~void funcion_1 (int, int), funcion_2 (int, int);~"
  3748. ""
  3749. "al igual que se declaran las variables."
  3750. ""
  3751. "A las declaraciones de las funciones también se les llama prototipos."
  3752. endvis
  3753. beginvis
  3754. cabecera " VALORES DEVUELTOS "
  3755. color 14 1
  3756. borde 2
  3757. coordenadas_completas 1 6 80 24
  3758. ""
  3759. "Todas las funciones, excepto aquéllas del tipo void, devuelven un valor."
  3760. "Este valor se especifica explícitamente en la sentencia return y si no"
  3761. "existe ésta, el valor es 0."
  3762. ""
  3763. "La forma general de return es:"
  3764. ""
  3765. "  ~return expresión;~"
  3766. ""
  3767. "Tres observaciones sobre la sentencia return:"
  3768. ""
  3769. "  1) La sentencia return tiene dos usos importantes. Primero, fuerza a una"
  3770. "  salida inmediata de la función, esto es, no espera a que se llegue a la"
  3771. "  última sentencia de la función para acabar. Segundo, se puede utilizar"
  3772. "  para devolver un valor."
  3773. ""
  3774. "  2) return no es una función sino una palabra clave del C, por lo tanto"
  3775. "  no necesita paréntesis como las funciones, aunque también es correcto:"
  3776. "    return (expresión);"
  3777. "  pero teniendo en cuenta que los parántesis forman parte de la expresión,"
  3778. "  no representan una llamada a una función."
  3779. ""
  3780. "  3) En las funciones de tipo void se puede hacer:"
  3781. "    return;"
  3782. "  y de esta forma se provoca la salida inmediata de la función."
  3783. ""
  3784. "Veamos un ejemplo para aclarar todo esto:"
  3785. ""
  3786. "~#include <stdio.h>"
  3787. "~"
  3788. "~int maximo (int, int);"
  3789. "~long potencia (int, int);"
  3790. "~"
  3791. "~void main (void)"
  3792. "~{"
  3793. "~  int a = 2, b = 3, c = 4, d = 5;"
  3794. "~  printf ("\nEl máximo entre %d y %d es %d.", a, b, maximo (a, b));"
  3795. "~  printf ("\n%d elevado a %d es %d.\n", c, d, potencia (c, d));"
  3796. "~}"
  3797. "~"
  3798. "~int maximo (int ma, int mb)"
  3799. "~{"
  3800. "~  return ma >= mb ? ma : mb;"
  3801. "~}"
  3802. "~"
  3803. "~long potencia (int pa, int pb)"
  3804. "~{"
  3805. "~  int i;"
  3806. "~  long pot = 1;"
  3807. "~  for (i = 1; i <= pb; i++)"
  3808. "~    pot *= pa;"
  3809. "~  return pot;"
  3810. "~}"
  3811. ""
  3812. "La salida de este programa es:"
  3813. ""
  3814. "~El máximo de 2 y 3 es 3.~"
  3815. "~4 elevado a 5 es 1024.~"
  3816. ""
  3817. endvis
  3818. borrar_pantalla
  3819. beginv
  3820. cabecera " TIPOS DE VARIABLES SEGUN EL LUGAR DE DECLARACION "
  3821. color 7 1
  3822. coordenadas_completas 1 2 80 7
  3823. "  Existen tres lugares básicos donde se pueden declarar variables: dentro"
  3824. "  de funciones, en la definición de parámetros de funciones y fuera de las"
  3825. "  funciones. Estas variables son, respectivamente, ~variables locales~,"
  3826. "  ~parámetros formales~ y ~variables globales~."
  3827. endv
  3828. beginvis
  3829. cabecera " VARIABLES LOCALES "
  3830. color 14 1
  3831. borde 2
  3832. coordenadas_completas 1 8 80 24
  3833. "Son aquéllas que se declaran dentro de una función."
  3834. ""
  3835. "Estas variables se declaran al principio de un bloque de código, se destru-"
  3836. "yen al llegar al final del bloque de código y sólo puede ser utilizada (ya"
  3837. "que sólo tiene existencia) dentro de ese bloque. Recuerda que un bloque de"
  3838. "código empieza con una llave abierta y termina con una llave cerrada."
  3839. ""
  3840. "Ejemplos:"
  3841. ""
  3842. "~void f1 (void)"
  3843. "~{"
  3844. "~  int x;   /* se reserva memoria para x */"
  3845. "~  x = 10;  /* se le asigna un valor */"
  3846. "~}          /* se libera la memoria asignada a x */"
  3847. ""
  3848. "~void f2 (void)"
  3849. "~{"
  3850. "~  int x = 1;           /* se reserva memoria para x */"
  3851. "~  /* sentencias */"
  3852. "~  {"
  3853. "~    int y = 2;         /* se reserva memoria para y */"
  3854. "~    /* sentencias */"
  3855. "~  }                    /* se libera memoria asignada a y */"
  3856. "~  /* sentencias */     /* en ese punto no existe la variable y */"
  3857. "~}                      /* se libera memoria asignada a x */"
  3858. ""
  3859. "~void f3 (void)"
  3860. "~{"
  3861. "~  int x, y; /* se reserva memoria para las variables x e y */"
  3862. "~  x = 1;    /* se asigna 1 a la variable x */"
  3863. "~  y = x;    /* se asigna x (1) a la variable y */"
  3864. "~  {         /* comienzo de un bloque de código */"
  3865. "~    int x;  /* se reserva memoria para x; ésta es distinta a la anterior */"
  3866. "~    x = 2;  /* se asigna 2 a la variable x de este bloque */"
  3867. "~    y = x;  /* se asigna x (2) a la variable y */"
  3868. "~  }         /* se libera memoria asignada a la variable x de este bloque */"
  3869. "~  y = x;    /* se asigna x (1) a la variable y */"
  3870. "~}           /* se libera memoria asignada a las variables x e y */"
  3871. endvis
  3872. beginvis
  3873. cabecera " PARAMETROS FORMALES "
  3874. color 14 1
  3875. borde 2
  3876. coordenadas_completas 1 8 80 24
  3877. "Si una función va a usar argumentos, entonces debe declarar las variables"
  3878. "que van a aceptar los valores de esos argumentos. Estas variables son los"
  3879. "parámetros formales de la función. Se comportan como cualquier otra varia-"
  3880. "ble local de la función."
  3881. ""
  3882. "Ejemplos:"
  3883. ""
  3884. "~void f1 (int x)"
  3885. "~{"
  3886. "~  /* x es una variable local a esta función */"
  3887. "~}"
  3888. ""
  3889. "~void f2 (int x)"
  3890. "~{"
  3891. "~  int x; /* ERROR: se ha intentado definir dos variables del mismo"
  3892. "~            nombre en el mismo ámbito */"
  3893. "~}"
  3894. endvis
  3895. beginvis
  3896. cabecera " VARIABLES GLOBALES "
  3897. color 14 1
  3898. borde 2
  3899. coordenadas_completas 1 8 80 24
  3900. "A diferencia de las variables locales, las variables globales se conocen a"
  3901. "lo largo de todo el programa y se pueden usar en cualquier parte de código."
  3902. "Además, mantienen su valor durante toda la ejecución del programa. Las va-"
  3903. "riables globales se crean al declararlas en cualquier parte fuera de una"
  3904. "función."
  3905. ""
  3906. "Ejemplo:"
  3907. ""
  3908. "~void f1 (void), f2 (void), f3 (void);"
  3909. "~"
  3910. "~int x;"
  3911. "~"
  3912. "~void main (void)"
  3913. "~{"
  3914. "~  f1 ();"
  3915. "~  f2 ();"
  3916. "~  f3 ();"
  3917. "~}"
  3918. "~"
  3919. "~void f1 (void)"
  3920. "~{"
  3921. "~  x = 10;"
  3922. "~}"
  3923. "~"
  3924. "~void f2 (void)"
  3925. "~{"
  3926. "~  x = 11;"
  3927. "~}"
  3928. "~"
  3929. "~void f3 (void)"
  3930. "~{"
  3931. "~  int x; /* esta variable x es local, es distinta a la global */"
  3932. "~  x = 12; /* se le asinga x a la variable x local, no a la global */"
  3933. "~}"
  3934. endvis
  3935. borrar_pantalla
  3936. beginv
  3937. cabecera " ESPECIFICADORES DE CLASE DE ALMACENAMIENTO "
  3938. color 7 1
  3939. coordenadas_completas 1 2 80 11
  3940. "Existen cuatro especificadores de clase de almacenamiento soportados por C."
  3941. "Son: ~extern~, ~static~, ~register~ y ~auto~."
  3942. ""
  3943. "Se usan para indicar al compilador cómo se debe almacenar la variable que le"
  3944. "sigue. El especificador de almacenamiento precede al resto de la declaración"
  3945. "de variable. Su forma general es:"
  3946. ""
  3947. "~especificador_de_almacenamiento  tipo  nombre_de_variable;~"
  3948. endv
  3949. beginvis
  3950. cabecera " EXTERN "
  3951. color 14 1
  3952. borde 2
  3953. coordenadas_completas 1 6 80 24
  3954. "Consideremos los dos siguientes ejemplos:"
  3955. ""
  3956. "  ~int a;        /* definición de una variable  */~"
  3957. "  ~extern int b; /* declaración de una variable */~"
  3958. ""
  3959. "En la primera sentencia estamos definiendo una variable de tipo entero"
  3960. "llamada a."
  3961. "En la segunda sentencia estamos declarando una variable de tipo entero"
  3962. "llamada b."
  3963. ""
  3964. "En la definición de una variable se reserva un espacio de memoria para"
  3965. "una variable."
  3966. "La declaración le indica al compilador que esa variable está o será"
  3967. "definida en otra parte, pero no reserva memoria para ella."
  3968. ""
  3969. "Así pues, una variable sólo se puede definir una vez pero se puede declarar"
  3970. "todas las veces que se desee."
  3971. ""
  3972. "A partir de ahora, cuando se diga declarar nos estaremos refiriendo a la"
  3973. "declaración y a la definición, a no ser que se distinga explícitamente"
  3974. "entre ambos conceptos, ya que es el término más utilizado en todos los"
  3975. "libros y programas."
  3976. ""
  3977. "El principal uso de extern se da cuando un programa está compuesto de varios"
  3978. "ficheros y tenemos una variable global a varios de ellos. Obsérvese el si-"
  3979. "guiente ejemplo:"
  3980. ""
  3981. "  ~/* Fichero 1 */~          ~/* Fichero 2 */~"
  3982. "  ~int x;         ~          ~extern int x;  ~"
  3983. "  ~main ()        ~          ~f2 ()          ~"
  3984. "  ~{              ~          ~{              ~"
  3985. "  ~  ...          ~          ~  ...          ~"
  3986. "  ~}              ~          ~}              ~"
  3987. "  ~f1 ()          ~          ~f3 ()          ~"
  3988. "  ~{              ~          ~{              ~"
  3989. "  ~  ...          ~          ~ ...           ~"
  3990. "  ~}              ~          ~}              ~"
  3991. ""
  3992. "En la situación anterior, a la variable x pueden acceder las cuatro funcio-"
  3993. "nes, es decir, los dos ficheros."
  3994. "Si no hubiésemos hecho"
  3995. "  extern int x;"
  3996. "las funciones del fichero 2 no podrían acceder a la variable x."
  3997. "Y si hubiésemos puesto"
  3998. "  int x;"
  3999. "en vez de"
  4000. "  extern int x;"
  4001. "en el fichero 2, entonces, el compilador daría un error porque se está"
  4002. "intentando definir dos veces la misma variable en el mismo ámbito."
  4003. endvis
  4004. beginvis
  4005. cabecera " STATIC "
  4006. color 14 1
  4007. borde 2
  4008. coordenadas_completas 1 6 80 24
  4009. ""
  4010. "Las variables globales son variables permanentes."
  4011. "Tienen dos significados diferentes dependiendo si son locales o globales."
  4012. ""
  4013. ""
  4014. "VARIABLES ESTATICAS LOCALES"
  4015. "---------------------------"
  4016. ""
  4017. "La diferencia con las variables locales normales es que su contenido no se"
  4018. "pierde al salirse de la función, de tal manera que al volver a entrar en la"
  4019. "función, la variable estática tiene el mismo valor que el que tenía cuando"
  4020. "terminó la función en la llamada anterior. La variable estática sólo es"
  4021. "inicializada en la primera llamada a la función."
  4022. ""
  4023. "Ejemplo:"
  4024. ""
  4025. "  ~#include <stdio.h>        ~"
  4026. "  ~                          ~"
  4027. "  ~void f1 (void), f2 (void);~"
  4028. "  ~                          ~"
  4029. "  ~void main (void)          ~"
  4030. "  ~{                         ~"
  4031. "  ~  f1 ();                  ~"
  4032. "  ~  f1 ();                  ~"
  4033. "  ~  f2 ();                  ~"
  4034. "  ~  f2 ();                  ~"
  4035. "  ~}                         ~"
  4036. "  ~                          ~"
  4037. "  ~void f1 (void)            ~"
  4038. "  ~{                         ~"
  4039. "  ~  static int x = 1;       ~"
  4040. "  ~  printf ("\nx = %d", x); ~"
  4041. "  ~  x++;                    ~"
  4042. "  ~}                         ~"
  4043. "  ~                          ~"
  4044. "  ~void f2 (void)            ~"
  4045. "  ~{                         ~"
  4046. "  ~  int y = 1;              ~"
  4047. "  ~  printf ("\ny = %d", y); ~"
  4048. "  ~  y++;                    ~"
  4049. "  ~}                         ~"
  4050. ""
  4051. "La salida de este programa es:"
  4052. ""
  4053. "~x = 1~"
  4054. "~x = 2~"
  4055. "~y = 1~"
  4056. "~y = 1~"
  4057. ""
  4058. ""
  4059. "VARIABLES ESTATICAS GLOBALES"
  4060. "----------------------------"
  4061. ""
  4062. "Cuando se aplica el modificador static a una variable global, se indica"
  4063. "al compilador que cree una variable global conocida únicamente en el"
  4064. "fichero en el que se declara la variable global static. Esto significa"
  4065. "que, aunque la variable es global, las rutinas de otros ficheros no la"
  4066. "reconocerán ni alternarán su contenido directamente; así, no estará"
  4067. "sujeta a efectos secundarios."
  4068. ""
  4069. endvis
  4070. beginvis
  4071. cabecera " REGISTER "
  4072. color 14 1
  4073. borde 2
  4074. coordenadas_completas 1 6 80 24
  4075. "El especificador register pide al compilador de C que mantenga el valor de"
  4076. "las variables definidas con ese modificador en un registro de la CPU en"
  4077. "lugar de en memoria, que es donde se almacenan normalmente las variables."
  4078. ""
  4079. "Varias observaciones:"
  4080. ""
  4081. "  1) El acceso a los registros de la CPU es mucho más rápido que el acceso"
  4082. "  a la memoria."
  4083. ""
  4084. "  2) Las variables register se almacenan en los registros si se puede, si"
  4085. "  no, se almacenan en memoria."
  4086. ""
  4087. "  3) Las variables register sólo pueden ser de tipo int y char, y además"
  4088. "  han de ser locales no estáticas o parámetros de función."
  4089. ""
  4090. "  4) En la mayoría de los sistemas sólo se permiten una o dos variables"
  4091. "  register al mismo tiempo. En la práctica, se declaran variables register"
  4092. "  aquéllas que se utilizan como índices en los bucles."
  4093. ""
  4094. "Ejemplo:"
  4095. ""
  4096. "  ~/* esta función calcula la potencia  ~"
  4097. "  ~   de dos números enteros */         ~"
  4098. "  ~int pot_ent (int base, int exponente)~"
  4099. "  ~{                                    ~"
  4100. "  ~  register temporal = 1;             ~"
  4101. "  ~  for (; exponente; exponente--)     ~"
  4102. "  ~    temporal *= base;                ~"
  4103. "  ~  return temporal;                   ~"
  4104. "  ~}                                    ~"
  4105. endvis
  4106. beginvis
  4107. cabecera " AUTO "
  4108. color 14 1
  4109. borde 2
  4110. coordenadas_completas 1 6 80 24
  4111. ""
  4112. "Las variables auto (automáticas) son todas aquellas variables locales que"
  4113. "no son estáticas."
  4114. ""
  4115. "En la práctica, este especificador de clase de almacenamiento no se utiliza"
  4116. "nunca, ya que todas las variables locales que no llevan el especificador"
  4117. "static son consideradas auto."
  4118. endvis
  4119. borrar_pantalla
  4120. beginvis
  4121. no_posicion
  4122. cabecera " REGLAS DE AMBITO DE LAS FUNCIONES "
  4123. color 15 1
  4124. coordenadas_completas 5 4 75 23
  4125. no_sombra
  4126. borde 0
  4127. ""
  4128. "Las reglas de ámbito de un lenguaje son las reglas que controlan"
  4129. "si un fragmento de código «conoce» o tiene acceso a otro fragmento"
  4130. "de código o de datos."
  4131. ""
  4132. "Si queremos que una función f() pueda ser llamada desde dos fi-"
  4133. "cheros distintos, hacemos lo siguiente:"
  4134. ""
  4135. "            ~/* Fichero 1 */ ~            ~/* Fichero 2 */~"
  4136. "            ~                ~            ~               ~"
  4137. "            ~void f (void);  ~            ~void f (void); ~"
  4138. "            ~                ~            ~               ~"
  4139. "            ~void main (void)~            ~void f2 (void) ~"
  4140. "            ~{               ~            ~{              ~"
  4141. "            ~  ...           ~            ~  ...          ~"
  4142. "            ~}               ~            ~               ~"
  4143. "            ~                ~            ~  f ();        ~"
  4144. "            ~void f (void)   ~            ~               ~"
  4145. "            ~{               ~            ~  ...          ~"
  4146. "            ~  ...           ~            ~}              ~"
  4147. "            ~}               ~            ~               ~"
  4148. ""
  4149. "Como se observa con las declaraciones (al principio de los dos fi-"
  4150. "cheros) y las definiciones (la función f() se define al final de"
  4151. "primer fichero) ocurre lo mismo que con las declaraciones y defi-"
  4152. "niciones de las variables globales."
  4153. ""
  4154. endvis
  4155. partir
  4156. beginvis
  4157. no_posicion
  4158. cabecera " ARGUMENTOS DE LAS FUNCIONES "
  4159. color 15 1
  4160. coordenadas_completas 2 3 78 24
  4161. no_sombra
  4162. borde 0
  4163. ""
  4164. "Si una función va a usar argumentos, debe declarar variables que tomen"
  4165. "los valores de las argumentos. Como se dijo antes, estas variables se"
  4166. "llaman parámetros formales de la función. Se comportan como otras varia-"
  4167. "bles locales dentro de la función, creándose al entrar en la función y"
  4168. "destruyéndose al salir."
  4169. ""
  4170. "Los argumentos se pueden pasar a las funciones de dos formas:"
  4171. ""
  4172. "  - Llamada por valor: este método copia el valor del argumento en el"
  4173. "    parámetro formal."
  4174. ""
  4175. "  - LLamada por referencia: este método copia la dirección del argumento"
  4176. "    (que ha de ser una variable) en el parámetro formal."
  4177. ""
  4178. "Los parámetros de la función printf son pasados por valor:"
  4179. "  printf ("%d", x); /* pasamos el valor de x */"
  4180. ""
  4181. "Los parámetros de la función scanf son pasados por referencia:"
  4182. "  scanf ("%d", &x); /* pasamos la dirección de x */"
  4183. ""
  4184. "Ejemplo de programa con función con llamadas por referencia:"
  4185. ""
  4186. "  ~#include <stdio.h>                   ~"
  4187. "  ~                                     ~"
  4188. "  ~void intercambiar (int *px, int *py);~"
  4189. "  ~                                     ~"
  4190. "  ~void main (void)                     ~"
  4191. "  ~{                                    ~"
  4192. "  ~  int x = 2, y = 3;                  ~"
  4193. "  ~  printf ("\nx = %d, y = %d", x, y); ~"
  4194. "  ~  intercambiar (&x, &y);             ~"
  4195. "  ~  printf ("\nx = %d, y = %d", x, y); ~"
  4196. "  ~}                                    ~"
  4197. "  ~                                     ~"
  4198. "  ~void intercambiar (int *px, int *py) ~"
  4199. "  ~{                                    ~"
  4200. "  ~  int temporal;                      ~"
  4201. "  ~  temporal = *px;                    ~"
  4202. "  ~  *px = *py;                         ~"
  4203. "  ~  *py = temporal;                    ~"
  4204. "  ~}                                    ~"
  4205. ""
  4206. "Comentario de este programa:"
  4207. ""
  4208. "En lecciones posteriores se van a estudiar los punteros (variables que"
  4209. "contienen direcciones de memoria) en profundidad, pero inevitablemente"
  4210. "ya nos hemos vistos obligados a hablar algo de ellos en lecciones an-"
  4211. "teriores, y otra vez vamos a estar obligados a hablar un poco más de"
  4212. "ellos en este momento si queremos completar nuestro estudio sobre las"
  4213. "funciones."
  4214. ""
  4215. "La forma general de declarar un puntero es:"
  4216. ""
  4217. "  ~tipo *nombre_puntero;~"
  4218. ""
  4219. "Una variable puntero es una variable que contiene una dirección de me-"
  4220. "moria. Al valor de la dirección de memoria apuntada por un puntero se"
  4221. "accede de la siguiente manera:"
  4222. ""
  4223. "  ~*nombre_puntero~"
  4224. ""
  4225. "La dirección de una variable, como se dijo en lecciones anteriores, se"
  4226. "obtiene de la siguiente forma:"
  4227. ""
  4228. "  ~&nombre_variable~"
  4229. ""
  4230. "En este caso, * es el operado de contenido y & es el operador de direc-"
  4231. "ción. Son monarios. No confundir con los operadores binarios de multipli-"
  4232. "cación (*) y de and a nivel de bits (&)."
  4233. ""
  4234. "Después de lo dicho, estamos en condiciones de comprender el programa"
  4235. "anterior."
  4236. ""
  4237. "Al hacer 'intercambiar (&x, &y);' estamos pasando a la función inter-"
  4238. "cambiar las direcciones de las variables x e y."
  4239. ""
  4240. "Al hacer la declaración 'void intercambiar (int *px, int *py)' estamos"
  4241. "declarando dos variables locales px e py que son punteros a enteros, es"
  4242. "decir, que contienen direcciones en las cuales hay valores enteros."
  4243. ""
  4244. "Al hacer '*px' y '*py' estamos accediendo a los valores de tipo entero"
  4245. "apuntados por las punteros px y py, es decir, estamos accediendo a los"
  4246. "valores de las variables x e y de la función main."
  4247. ""
  4248. "Hay un caso especial de llamada por referencia que es el paso de arrays"
  4249. "como argumento de una función. También este caso se discutió cuando se"
  4250. "describió la función scanf en la lección anterior. Y también, al igual"
  4251. "que los punteros, se desarrollará los arrays en lecciones posteriores"
  4252. "(concretamente en la lección siguiente). Pero, no obstante, hay que hacer"
  4253. "algunas observaciones en este momento para explicar cómo se pueden pasar"
  4254. "como argumento a una función."
  4255. ""
  4256. "Recordemos que el nombre de la variable array es un puntero al primer"
  4257. "elemento del array. De esta forma cuando se usa un array como un argu-"
  4258. "mento a una función, sólo se pasa la dirección del array, no una copia"
  4259. "del array entero. Cuando se llama a una función con un nombre de array,"
  4260. "se pasa a la función un puntero al primer elemento del array."
  4261. ""
  4262. "Existen tres formas de declarar un parámetro que va a recibir un puntero"
  4263. "a un array. Veamos con un ejemplo las tres formas."
  4264. ""
  4265. "  ~#include <stdio.h>                 ~"
  4266. "  ~                                   ~"
  4267. "  ~void funcion_ejemplo_1 (int a[10]);~"
  4268. "  ~void funcion_ejemplo_2 (int a[]);  ~"
  4269. "  ~void funcion_ejemplo_3 (int *a);   ~"
  4270. "  ~                                   ~"
  4271. "  ~void main (void)                   ~"
  4272. "  ~{                                  ~"
  4273. "  ~  int array [10];                  ~"
  4274. "  ~  register int i;                  ~"
  4275. "  ~  for (i = 0; i < 10; i++)         ~"
  4276. "  ~    array[i] = i;                  ~"
  4277. "  ~  funcion_ejemplo_1 (array);       ~"
  4278. "  ~  funcion_ejemplo_2 (array);       ~"
  4279. "  ~  funcion_ejemplo_3 (array);       ~"
  4280. "  ~}                                  ~"
  4281. "  ~                                   ~"
  4282. "  ~void funcion_ejemplo_1 (int a[10]) ~"
  4283. "  ~{                                  ~"
  4284. "  ~  register int i;                  ~"
  4285. "  ~  for (i = 0; i < 10; i++)         ~"
  4286. "  ~    printf ("%d ", a[i]);          ~"
  4287. "  ~}                                  ~"
  4288. "  ~                                   ~"
  4289. "  ~void funcion_ejemplo_2 (int a[])   ~"
  4290. "  ~{                                  ~"
  4291. "  ~  register int i;                  ~"
  4292. "  ~  for (i = 0; i < 10; i++)         ~"
  4293. "  ~    printf ("%d ", a[i]);          ~"
  4294. "  ~}                                  ~"
  4295. "  ~                                   ~"
  4296. "  ~void funcion_ejemplo_3 (int *a)    ~"
  4297. "  ~{                                  ~"
  4298. "  ~  register int i;                  ~"
  4299. "  ~  for (i = 0; i < 10; i++)         ~"
  4300. "  ~    printf ("%d ", a[i]);          ~"
  4301. "  ~}                                  ~"
  4302. ""
  4303. "En la función funcion_ejemplo_1(), el parámetro a se declara como un"
  4304. "array de enteros de diez elementos, el compilador de C automáticamente"
  4305. "lo convierte a un puntero a entero. Esto es necesario porque ningún"
  4306. "parámetro puede recibir un array de enteros; de esta manera sólo se"
  4307. "pasa un puntero a un array. Así, debe haber en las funciones un pará-"
  4308. "metro de tipo puntero para recibirlo."
  4309. ""
  4310. "En la función funcion_ejemplo_2(), el parámetro a se declara como un"
  4311. "array de enteros de tamaño desconocido. Ya que el C no comprueba los"
  4312. "límites de los arrays, el tamaño real del array es irrelevante al"
  4313. "parámetro (pero no al programa, por supuesto). Además, este método"
  4314. "de declaración define a como un puntero a entero."
  4315. ""
  4316. "En la función funcion_ejemplo_3(), el parámetro a se declara como un"
  4317. "puntero a entero. Esta es la forma más común en los programas escritos"
  4318. "profesionalmente en C. Esto se permite porque cualquier puntero se puede"
  4319. "indexar usando [] como si fuese un array. (En realidad, los arrays y los"
  4320. "punteros están muy relacionados)."
  4321. ""
  4322. "Los tres métodos de declarar un parámetro de tipo array llevan al mismo"
  4323. "resultado: un puntero."
  4324. ""
  4325. "Otro ejemplo:"
  4326. ""
  4327. "  ~#include <stdio.h>                ~"
  4328. "  ~                                  ~"
  4329. "  ~void funcion_ejemplo (int numero);~"
  4330. "  ~                                  ~"
  4331. "  ~void main (void)                  ~"
  4332. "  ~{                                 ~"
  4333. "  ~  int array [10];                 ~"
  4334. "  ~  register int i;                 ~"
  4335. "  ~  for (i = 0; i < 10; i++)        ~"
  4336. "  ~    funcion_ejemplo (array[i]);   ~"
  4337. "  ~}                                 ~"
  4338. "  ~                                  ~"
  4339. "  ~void funcion_ejemplo (int numero) ~"
  4340. "  ~{                                 ~"
  4341. "  ~  printf ("%d ", numero);         ~"
  4342. "  ~}                                 ~"
  4343. ""
  4344. endvis
  4345. beginvis
  4346. no_posicion
  4347. cabecera " ARGUMENTOS DE MAIN "
  4348. color 15 1
  4349. coordenadas_completas 5 4 75 23
  4350. no_sombra
  4351. borde 0
  4352. ""
  4353. "Algunas veces es útil pasar información al programa cuando se va a"
  4354. "ejecutar. Los argumentos en la línea de órdenes son las informacio-"
  4355. "nes que siguen al nombre del programa en la línea de órdenes del"
  4356. "sistema operativo."
  4357. ""
  4358. "En este caso, la función ~main~ se declara para recibir dos paráme-"
  4359. "tros especiales, ~argc~ y ~argv~, que se utilizan para recibir los"
  4360. "argumentos de la línea de órdenes."
  4361. ""
  4362. "El parámetro argc contiene el número de argumentos de la línea de"
  4363. "órdenes y es un entero. Siempre vale 1, por lo menos, ya que el"
  4364. "nombre del programa cuenta como el primer agumento."
  4365. ""
  4366. "El parámetro argv es un array donde cada elemento es una cadena de"
  4367. "caracteres, la cual contiene la información suministrada al pro-"
  4368. "grama a través de la línea de órdenes del sistema operativo. Dicho"
  4369. "de otro modo, un array donde cada elemento es un puntero al primer"
  4370. "elemento de la cadena correspondiente."
  4371. ""
  4372. "Ejemplo:"
  4373. ""
  4374. "  ~/*                                                      ~"
  4375. "  ~   Este programa acepta un nombre en la línea de        ~"
  4376. "  ~   órdenes tras el nombre del programa e imprime        ~"
  4377. "  ~   un mensaje de salutación                             ~"
  4378. "  ~*/                                                      ~"
  4379. "  ~                                                        ~"
  4380. "  ~#include <stdio.h>                                      ~"
  4381. "  ~                                                        ~"
  4382. "  ~void main (int argc, char *argv[])                      ~"
  4383. "  ~{                                                       ~"
  4384. "  ~  if (argc != 2)                                        ~"
  4385. "  ~    printf ("El número de argumentos es incorrecto.\n");~"
  4386. "  ~  else                                                  ~"
  4387. "  ~    printf ("Hola %s.\n", argv[1]);                     ~"
  4388. "  ~}                                                       ~"
  4389. begint
  4390. ""
  4391. "En Turbo C, también podemos utilizar un tercer parámetro en la"
  4392. "función main, ~arge~, con la misma estructura que el parámetro argv,"
  4393. "y que contiene las cadenas del entorno."
  4394. ""
  4395. "El último elemento del vector arge (al igual que en argv) contiene"
  4396. "el valor NULL; esto indica que el puntero del último elemento de"
  4397. "arge no apunta a ningún sitio. Recordamos que NULL es una constante"
  4398. "definida en las librerías <stdio.h> y <stdlib.h> entre otras, y"
  4399. "equivale al valor 0."
  4400. ""
  4401. "Los nombres argc, argv y arge son una convención ya que pueden"
  4402. "tener cualquier nombre válido de un identificador en C."
  4403. ""
  4404. "Ejemplo:"
  4405. ""
  4406. "  ~/*                                              ~"
  4407. "  ~  Este programa acepta una serie de argumentos  ~"
  4408. "  ~  en la línea de órdenes del sistema operativo  ~"
  4409. "  ~  y los imprime                                 ~"
  4410. "  ~*/                                              ~"
  4411. "  ~                                                ~"
  4412. "  ~#include <stdio.h> /* printf (), NULL */        ~"
  4413. "  ~                                                ~"
  4414. "  ~void main (int argc, char *argv[], char *arge[])~"
  4415. "  ~{                                               ~"
  4416. "  ~  register int i;                               ~"
  4417. "  ~  printf ("argc = %d\n", argc);                 ~"
  4418. "  ~  for (i = 0; i < argc; i++)                    ~"
  4419. "  ~    printf ("argv[%d] = \"%s\"\n", i, argv[i]); ~"
  4420. "  ~  for (i = 0; arge[i] != NULL; i++)             ~"
  4421. "  ~    printf ("arge[%d] = \"%s\"\n", i, arge[i]); ~"
  4422. "  ~}                                               ~"
  4423. endt
  4424. ""
  4425. endvis
  4426. beginvis
  4427. no_posicion
  4428. cabecera " RECURSIVIDAD "
  4429. color 15 1
  4430. coordenadas_completas 5 4 75 23
  4431. no_sombra
  4432. borde 0
  4433. ""
  4434. "Las funciones en C se pueden llamar a sí mismas. Si una expresión"
  4435. "en el cuerpo de una función se llama a sí misma, la función es"
  4436. "recursiva."
  4437. ""
  4438. "Vamos a escribir dos versiones del cálculo del factorial de un"
  4439. "número:"
  4440. ""
  4441. " ~unsigned long fact1 (int n)   ~   ~unsigned long fact2 (int n)     ~"
  4442. " ~{                             ~   ~{                               ~"
  4443. " ~  register int i;             ~   ~  unsigned long factorial;      ~"
  4444. " ~  unsigned long factorial = 1;~   ~  if (n <= 1)                   ~"
  4445. " ~  for (i = 1; i <= n; i++)    ~   ~    factorial = 1;              ~"
  4446. " ~    factorial *= i;           ~   ~  else                          ~"
  4447. " ~  return (factorial);         ~   ~    factorial = n * fact2 (n-1);~"
  4448. " ~}                             ~   ~  return (factorial);           ~"
  4449. " ~                              ~   ~}                               ~"
  4450. ""
  4451. "La función fact1 es la versión iterativa y fact2 es la versión re-"
  4452. "cursiva del cálculo del factorial de un número."
  4453. ""
  4454. "La versión iterativa tiene dos ventajas sobre la versión recursiva:"
  4455. ""
  4456. "  1. Es más rápida."
  4457. "  2. Consume menos memoria."
  4458. ""
  4459. "La versión recursiva es preferible en aquellos casos en los que la"
  4460. "lógica es mucho más clara y sencilla que en la versión iterativa."
  4461. ""
  4462. "En el ejemplo anterior es preferible la versión iterativa a la re-"
  4463. "cursiva ya que la dificultad en la lógica es similar en ambos casos."
  4464. ""
  4465. "Cuando se escriben funciones recursivas se debe tener una expresión"
  4466. "if en algún sitio que fuerce a la función a volver sin que se eje-"
  4467. "cute la llamada recursiva. Si no se hace así, la función nunca de-"
  4468. "volverá el control una vez que se le ha llamado; esto produce un"
  4469. "desbordamiento de la pila."
  4470. ""
  4471. endvis
  4472. beginvis
  4473. no_posicion
  4474. cabecera " SEPARACION DE UN PROGRAMA EN VARIOS FICHEROS "
  4475. color 15 1
  4476. coordenadas_completas 5 4 75 23
  4477. no_sombra
  4478. borde 0
  4479. ""
  4480. "En programas grandes es conveniente dividir el código fuente en"
  4481. "varios ficheros y compilarlos por separados."
  4482. ""
  4483. "Esto tiene dos grandes ventajas:"
  4484. ""
  4485. "  1. Mayor modularidad."
  4486. "  2. Tiempos de compilación más cortos, ya que cuando modificamos"
  4487. "     un fichero con código fuente, sólo tenemos que compilar ese"
  4488. "     fichero y enlazar el programa."
  4489. ""
  4490. "La forma de realizar la compilación separada depende del compilador."
  4491. begint
  4492. ""
  4493. "En Turbo C, la compilación separada se consigue creando un fichero"
  4494. "proyecto (con extensión .PRJ) en el cual se listan todos los fi-"
  4495. "cheros fuentes que componen el proyecto. En todas las versiones hay"
  4496. "una opción para manejar los proyectos: abrirlos, cerrarlos, obtener"
  4497. "ayuda acerca de ellos, etcétera."
  4498. endt
  4499. ""
  4500. endvis
  4501. beginvis
  4502. no_posicion
  4503. cabecera " NUMERO VARIABLE DE ARGUMENTOS "
  4504. color 15 1
  4505. coordenadas_completas 2 3 78 24
  4506. no_sombra
  4507. borde 0
  4508. ""
  4509. "En la librería ~<stdarg.h>~ nos encontramos toda la información necesaria"
  4510. "para declarar funciones en las que el número y el tipo de parámetros es"
  4511. "variable."
  4512. ""
  4513. "Vamos a mostrar inmediatamente un ejemplo y vamos a basar la explicación"
  4514. "de este apartado sobre el ejemplo."
  4515. ""
  4516. "  ~#include <stdio.h>  /* vprintf () */                            ~"
  4517. "  ~#include <stdarg.h> /* va_list, va_start (), va_end () */       ~"
  4518. "  ~                                                                ~"
  4519. "  ~void imprimir_cadena_con_formato (char *cadena_de_formato, ...);~"
  4520. "  ~                                                                ~"
  4521. "  ~void main (void)                                                ~"
  4522. "  ~{                                                               ~"
  4523. "  ~  imprimir_cadena_con_formato ("%d %f %s", 5, 2.3, "cadena");   ~"
  4524. "  ~}                                                               ~"
  4525. "  ~                                                                ~"
  4526. "  ~void imprimir_cadena_con_formato (char *cadena_de_formato, ...) ~"
  4527. "  ~{                                                               ~"
  4528. "  ~  va_list puntero_a_los_argumentos;                             ~"
  4529. "  ~  va_start (puntero_a_los_argumentos, cadena_de_formato);       ~"
  4530. "  ~  vprintf (cadena_de_formato, puntero_a_los_argumentos);        ~"
  4531. "  ~  va_end (puntero_a_los_argumentos);                            ~"
  4532. "  ~}                                                               ~"
  4533. ""
  4534. "Si nos fijamos en la declaración de la función"
  4535. ""
  4536. "  ~void imprimir_cadena_con_formato (char *cadena_de_formato, ...)~"
  4537. ""
  4538. "observamos que el primer argumento es una cadena (un puntero al primer"
  4539. "elemento de la cadena, es decir, un puntero al primer carácter) y a"
  4540. "continuación tenemos puntos suspensivos (...) que simbolizan que el"
  4541. "número y tipo de argumentos después del primero es variable."
  4542. ""
  4543. "En la primera línea de la función"
  4544. ""
  4545. "  ~va_list puntero_a_los_argumentos;~"
  4546. ""
  4547. "nos encontramos la definición de una variable (puntero_a_los_argumentos)"
  4548. "que es del tipo va_list, es decir, esta variable es un puntero a uno"
  4549. "de los argumentos. El tipo va_list es un tipo definido en la librería"
  4550. "<stdarg.h>. En otras lecciones veremos cómo podemos definir nuevos tipos"
  4551. "a partir de los tipos básicos del lenguaje."
  4552. ""
  4553. "La siguiente línea de la función en cuestión"
  4554. ""
  4555. "  ~va_start (puntero_a_los_argumentos, cadena_de_formato);~"
  4556. ""
  4557. "es una llamada a la función va_start(). Esta función está declarada en"
  4558. "la librería <stdarg.h> y acepta dos parámetros. El primero es de tipo"
  4559. "va_list, es decir, es el puntero a los argumentos, y el segundo paráme-"
  4560. "tro ha de ser el parámetro conocido situado más a la derecha en la fun-"
  4561. "ción en que estamos, que en este caso es la cadena de formato. La misión"
  4562. "de la función va_start() es inicializar el puntero a los argumentos."
  4563. ""
  4564. "A continuación nos encontramos la sentencia"
  4565. ""
  4566. "  ~vprintf (cadena_de_formato, puntero_a_los_argumentos);~"
  4567. ""
  4568. "que es una llamada a la función vprintf(). La función vprintf() hace lo"
  4569. "mismo que la función printf() con la diferencia que está basada en una"
  4570. "lista de argumentos variables. Lo mismo ocurre con las funciones vscanf()"
  4571. "y scanf()."
  4572. ""
  4573. "La última línea de la función en estudio"
  4574. ""
  4575. "  ~va_end (puntero_a_los_argumentos);~"
  4576. ""
  4577. "es una llamada a la función va_end(). Esta función está declarada en la"
  4578. "librería <stdarg.h> y acepta un parámetro que es de tipo va_list y debe"
  4579. "ser el puntero a los argumentos. La misión de la función va_end() es"
  4580. "finalizar el acceso del puntero a los argumentos. Es importante llamar"
  4581. "a esta función cuando ya no es necesario utilizar el puntero a lo argu-"
  4582. "mentos."
  4583. ""
  4584. "En la librería <stdarg.h> tenemos sólamente cuatro elementos: un tipo"
  4585. "(va_list) y tres funciones (va_start(), va_end() y va_arg()). La fun-"
  4586. "ción va_arg() que es la que nos queda por explicar la vamos a ver, al"
  4587. "igual que las otras, con un ejemplo."
  4588. ""
  4589. " ~                                                                       ~"
  4590. " ~  /* Ejemplo de argumento de longitud variable: suma de una serie */   ~"
  4591. " ~                                                                       ~"
  4592. " ~                                                                       ~"
  4593. " ~  #include <stdio.h>  /* printf () */                                  ~"
  4594. " ~  #include <stdarg.h> /* va_list, va_start (), va_arg (), va_end () */ ~"
  4595. " ~                                                                       ~"
  4596. " ~                                                                       ~"
  4597. " ~  void main (void)                                                     ~"
  4598. " ~  {                                                                    ~"
  4599. " ~    double d, suma_serie ();                                           ~"
  4600. " ~                                                                       ~"
  4601. " ~    d = suma_serie (5, 0.5, 0.25, 0.125, 0.0625, 0.03125);             ~"
  4602. " ~                                                                       ~"
  4603. " ~    printf ("La suma de la serie es %f\n", d);                         ~"
  4604. " ~  }                                                                    ~"
  4605. " ~                                                                       ~"
  4606. " ~                                                                       ~"
  4607. " ~  double suma_serie (int num)                                          ~"
  4608. " ~  {                                                                    ~"
  4609. " ~    double suma = 0.0, t;                                              ~"
  4610. " ~    va_list ptrarg;                                                    ~"
  4611. " ~                                                                       ~"
  4612. " ~    va_start (ptrarg, num);                                            ~"
  4613. " ~                                                                       ~"
  4614. " ~    for (; num; num--)                                                 ~"
  4615. " ~      {                                                                ~"
  4616. " ~        t = va_arg (ptrarg, double);                                   ~"
  4617. " ~        suma += t;                                                     ~"
  4618. " ~      }                                                                ~"
  4619. " ~                                                                       ~"
  4620. " ~    va_end (ptrarg);                                                   ~"
  4621. " ~    return suma;                                                       ~"
  4622. " ~  }                                                                    ~"
  4623. " ~                                                                       ~"
  4624. ""
  4625. "La novedad en este programa es la aparición de la función va_arg(). Esta"
  4626. "función está declarada en la librería <stdarg.h>. Acepta dos parámetros:"
  4627. "el primero ha de ser el puntero a los argumentos y el segundo es el pará-"
  4628. "metro conocido más a la derecha en la función en la que estamos. La fun-"
  4629. "ción va_arg() devuelve el argumento al cual el puntero a los argumentos"
  4630. "apunta actualmente."
  4631. ""
  4632. endvis
  4633. beginv
  4634. cabecera " EL PREPROCESADOR C "
  4635. color 7 1
  4636. coordenadas_completas 1 2 80 8
  4637. borde 2
  4638. "El preprocesador le da ciertas órdenes al compilador. Conceptualmente, el"
  4639. "preprocesador procesa el código fuente antes que el compilador. A las ins-"
  4640. "trucciones del preprocesador se les llama directivas de preprocesamiento."
  4641. "Todas empiezan con el símbolo #. Las directivas del ANSI C son: ~#include,~"
  4642. "~#define,#undef,#error,#if,#else,#elif,#endif,#ifdef,#ifndef,#line y #pragma.~"
  4643. endv
  4644. beginvis
  4645. cabecera " DIRECTIVA #include "
  4646. color 14 1
  4647. borde 2
  4648. coordenadas_completas 1 9 80 24
  4649. "Cuando el preprocesador encuentra un comando #include busca el fichero que"
  4650. "atiende por el nombre que está situado detrás y lo incluye en el fichero"
  4651. "actual."
  4652. ""
  4653. "El nombre del fichero puede venir de dos formas:"
  4654. ""
  4655. "  ~#include <stdio.h>~"
  4656. "  ~#include "mifichero.h"~"
  4657. ""
  4658. "El primer #include busca el fichero stdio.h en los directorios del sistema."
  4659. "El segundo #include busca el fichero en el directorio en el que se está"
  4660. "trabajando. Si se incluye path, lo busca en el directorio especificado:"
  4661. ""
  4662. "  ~#include "c:\programa\prog.h"~"
  4663. ""
  4664. "Ejemplo:"
  4665. ""
  4666. "  ~/* Fichero p.h */~"
  4667. "  ~                 ~"
  4668. "  ~void f (void);   ~"
  4669. ""
  4670. ""
  4671. "  ~/* Fichero p.c */~"
  4672. "  ~                 ~"
  4673. "  ~#include "p.h"   ~"
  4674. "  ~                 ~"
  4675. "  ~void main (void) ~"
  4676. "  ~{                ~"
  4677. "  ~  f ();          ~"
  4678. "  ~}                ~"
  4679. "  ~                 ~"
  4680. "  ~void f (void)    ~"
  4681. "  ~{                ~"
  4682. "  ~}                ~"
  4683. ""
  4684. "Conceptualmente, una vez que este programa (compuesto de dos ficheros)"
  4685. "ha sido procesado por el preprocesador, el compilador encuentra un solo"
  4686. "fichero:"
  4687. ""
  4688. "  ~/* Fichero p.c */~"
  4689. "  ~                 ~"
  4690. "  ~/* Fichero p.h */~"
  4691. "  ~                 ~"
  4692. "  ~void f (void);   ~"
  4693. "  ~                 ~"
  4694. "  ~void main (void) ~"
  4695. "  ~{                ~"
  4696. "  ~  f ();          ~"
  4697. "  ~}                ~"
  4698. "  ~                 ~"
  4699. "  ~void f (void)    ~"
  4700. "  ~{                ~"
  4701. "  ~}                ~"
  4702. endvis
  4703. beginvis
  4704. cabecera " DIRECTIVA #define "
  4705. color 14 1
  4706. borde 2
  4707. coordenadas_completas 1 9 80 24
  4708. "La directiva #define sustituye en el código fuente un determinado identifi-"
  4709. "cador por la cadena especificada."
  4710. ""
  4711. "Tiene dos formas. La primera de ellas es:"
  4712. ""
  4713. "  ~#define identificador cadena~"
  4714. ""
  4715. "A este identificador se le llama nombre de macro o simplemente macro."
  4716. ""
  4717. "Esta directiva hace que a partir de la definición de la macro, cada vez que"
  4718. "el preprocesador encuentre identificador en el código fuente, lo sustituya"
  4719. "por cadena."
  4720. ""
  4721. "Las directivas no son sentencias C, por eso no llevan puntos y coma al"
  4722. "final."
  4723. ""
  4724. "La cadena abarca desde el primer carácter no blanco después de identificador"
  4725. "hasta el final de la línea."
  4726. ""
  4727. "Ejemplo:"
  4728. ""
  4729. "  ~#include <stdio.h>           ~"
  4730. "  ~                             ~"
  4731. "  ~#define BOOLEAN short        ~"
  4732. "  ~#define TRUE    1            ~"
  4733. "  ~#define FALSE   0            ~"
  4734. "  ~                             ~"
  4735. "  ~void main (void)             ~"
  4736. "  ~{                            ~"
  4737. "  ~  BOOLEAN v = TRUE;          ~"
  4738. "  ~  printf ("%d %d", v, FALSE);~"
  4739. "  ~}                            ~"
  4740. ""
  4741. "Cuando el preprocesador procesa este programa, el compilador se encuentra:"
  4742. ""
  4743. "  ~#include <stdio.h>       ~"
  4744. "  ~                         ~"
  4745. "  ~void main (void)         ~"
  4746. "  ~{                        ~"
  4747. "  ~  short v = 1;           ~"
  4748. "  ~  printf ("%d %d", v, 0);~"
  4749. "  ~}                        ~"
  4750. ""
  4751. "En realidad, en este ejemplo, el procesador también sustituiría la línea"
  4752. "del #include por el contenido del fichero stdio.h, pero lo hemos obviado"
  4753. "porque en este momento estamos explicando la directiva #define y además el"
  4754. "contenido del fichero stdio.h depende de cada implementación de compilador"
  4755. "de C."
  4756. ""
  4757. "Por convención y para distinguir un lector las macros de los demás identifi-"
  4758. "cadores del C, éstas se suelen escribir en mayúsculas."
  4759. ""
  4760. "Las macros pueden ser utilizadas como parte de la definición de otras macros."
  4761. "Por ejemplo:"
  4762. ""
  4763. "  ~#define UNO  1~"
  4764. "  ~#define DOS  UNO + UNO~"
  4765. "  ~#define TRES UNO + DOS~"
  4766. ""
  4767. "Es importante comprender que la sustitución es simplemente el reemplaza-"
  4768. "miento de un identificador por su cadena asociada. Así se puede hacer:"
  4769. ""
  4770. "  ~#define ERROR "Se ha producido un error"~"
  4771. "  ~printf (ERROR);~"
  4772. ""
  4773. "RECOMENDACION IMPORTANTE: siempre que se pueda es conveniente encerrar"
  4774. "la definición de la macro entre paréntesis."
  4775. ""
  4776. "Obsérvese en el siguiente ejemplo lo que puede ocurrir de no hacerse así:"
  4777. ""
  4778. "  ~#define CUATRO 2+2~"
  4779. "  ~/* ... */~"
  4780. "  ~x = CUATRO * CUATRO;~"
  4781. ""
  4782. "El preprocesador expande la asignación de x a:"
  4783. ""
  4784. "  ~x = 2+2 * 2+2;~"
  4785. ""
  4786. "Si se hubiese definido la macro CUATRO de la forma:"
  4787. ""
  4788. "  ~#define CUATRO (2+2)~"
  4789. ""
  4790. "la expansión de la asignación de x es:"
  4791. ""
  4792. "  ~x = (2+2) * (2+2);~"
  4793. ""
  4794. "Como se ve, en el primer caso se asigna el valor 8 a la variable x, mientras"
  4795. "que en el segundo se asigna el valor 16 a la variable x que es lo que real-"
  4796. "mente se desea."
  4797. ""
  4798. "Si el identificador aparece dentro de una cadena no se lleva a cabo sustitu-"
  4799. "ciones. Por ejemplo:"
  4800. ""
  4801. "  ~#define XYZ esto es una prueba~"
  4802. "  ~/* ... */~"
  4803. "  ~printf ("XYZ");~"
  4804. ""
  4805. "El código anterior no imprime «esto es una prueba»; imprime «XYZ»."
  4806. ""
  4807. "Cuando la cadena es más larga de una línea, se puede continuar en la si-"
  4808. "guiente poniendo una barra invertida al final de la línea. Por ejemplo:"
  4809. ""
  4810. "  ~#define MACRO \~"
  4811. "  ~  if (x < y)  \~"
  4812. "  ~    f1 ();    \~"
  4813. "  ~  else        \~"
  4814. "  ~    f2 ();     ~"
  4815. ""
  4816. "La segunda forma de la directiva #define es:"
  4817. ""
  4818. "  ~#define id1(id2,...) cadena~"
  4819. ""
  4820. "El paréntesis ha de ir inmediatamente después de id1 ya que si no pertene-"
  4821. "cería a la cadena."
  4822. ""
  4823. "Todas las instancias de id2 en cadena serán reemplazadas con el texto actual"
  4824. "definido por id2 cuando id1 es referenciado en el código fuente."
  4825. ""
  4826. "Ejemplo:"
  4827. ""
  4828. "  ~#define SUMA(a,b)  a + b~"
  4829. "  ~/* ... */~"
  4830. "  ~x = SUMA (5, 8);~"
  4831. ""
  4832. "Esto expande a:"
  4833. ""
  4834. "  ~x = 5 + 8;~"
  4835. ""
  4836. "Observar que en el #define es obligatorio que el paréntesis vaya junto a"
  4837. "SUMA; sin embargo, cuando se llama a la macro no es obligatorio que el"
  4838. "paréntesis abierto vaya junto a SUMA."
  4839. ""
  4840. "RECOMENDACION IMPORTANTE: se recomienda que todos los argumentos de la"
  4841. "macro en la cadena vayan entre paréntesis para prevenir casos como el"
  4842. "siguiente:"
  4843. ""
  4844. "  ~#define PRODUCTO(a,b) (a * b)~"
  4845. "  ~/* ... */~"
  4846. "  ~x = PRODUCTO (2+3, 4);~"
  4847. ""
  4848. "Esto expande la asignación de la x a:"
  4849. ""
  4850. "  ~x = (2+3 * 4);~"
  4851. ""
  4852. "Si se hubiese definido la macro de la forma:"
  4853. ""
  4854. "  ~#define PRODUCTO(a,b)  ((a) * (b))~"
  4855. ""
  4856. "entonces la asignación de la x se expandiría a:"
  4857. ""
  4858. "  ~x = ((2+3) * (4));~"
  4859. ""
  4860. "Como se ve, en el primer caso se asigna el valor 14 a la variable x,"
  4861. "mientras que en el segundo se asigna el valor 20 a la variable x que"
  4862. "es lo que realmente se desea."
  4863. ""
  4864. "Otros ejemplos de macros:"
  4865. ""
  4866. "  ~#define MIN(a,b) ((a) < (b) ? (a) : (b))~"
  4867. "  ~#define MAX(a,b) ((a) > (b) ? (a) : (b))~"
  4868. "  ~#define ESTA_ENTRE(x,x1,x2) ((x) >= (x1) && (x) <= (x2))~"
  4869. ""
  4870. "A las macros sin argumentos también se les llama constantes simbólicas e"
  4871. "incluso, en algunos sitios, simplemente constantes. Constantes simbólicas"
  4872. "ya vistas son EOF y NULL. Las funciones va_arg(), va_start() y va_end()"
  4873. "vistas anteriormente, son macros en algunas implementaciones, pero esto es"
  4874. "transparente para el usuario."
  4875. ""
  4876. "Ejemplo:"
  4877. ""
  4878. "  ~/* Fichero prog_ej.h */                                      ~"
  4879. "  ~#include <stdio.h>                                           ~"
  4880. "  ~#define funcion_principal main                               ~"
  4881. "  ~#define principio {                                          ~"
  4882. "  ~#define final }                                              ~"
  4883. "  ~#define numero_entero int                                    ~"
  4884. "  ~#define escribir_cadena(cadena) printf (cadena)              ~"
  4885. "  ~#define escribir_numero_entero(numero) printf ("%d", numero);~"
  4886. "  ~#define leer_numero_entero(numero) scanf ("%d", &numero);    ~"
  4887. ""
  4888. "  ~/* Fichero prog_ej.c */                     ~"
  4889. "  ~#include "prog_ej.h"                        ~"
  4890. "  ~void funcion_principal (void)               ~"
  4891. "  ~principio                                   ~"
  4892. "  ~  numero_entero x;                          ~"
  4893. "  ~  escribir_cadena ("Introduce un número: ");~"
  4894. "  ~  leer_numero_entero (x);                   ~"
  4895. "  ~  escribir_cadena ("x = ");                 ~"
  4896. "  ~  escribir_numero_entero (x);               ~"
  4897. "  ~final                                       ~"
  4898. ""
  4899. "El uso de macros con argumentos en lugar de funciones reales tiene princi-"
  4900. "palmente una ventaja: las sustituciones incrementan la velocidad del códi-"
  4901. "go porque no se gasta tiempo en llamar a la función. Sin embargo, hay que"
  4902. "pagar un precio por el aumento de velocidad: el tamaño del programa aumen-"
  4903. "ta debido a la duplicación del código."
  4904. endvis
  4905. beginvis
  4906. cabecera " DIRECTIVA #undef "
  4907. color 14 1
  4908. borde 2
  4909. coordenadas_completas 1 9 80 24
  4910. "La directiva #undef elimina una definición anterior de la macro que le"
  4911. "sigue."
  4912. ""
  4913. "La forma general es:"
  4914. ""
  4915. "  ~#undef identificador~"
  4916. ""
  4917. "Ejemplo:"
  4918. ""
  4919. "  ~#define TAMANIO_ARRAY 100                  ~"
  4920. "  ~int array [TAMANIO_ARRAY];                 ~"
  4921. "  ~#undef TAMANIO_ARRAY                       ~"
  4922. "  ~/* aquí no existe la macro TAMANIO_ARRAY */~"
  4923. endvis
  4924. beginvis
  4925. cabecera " DIRECTIVA #error "
  4926. color 14 1
  4927. borde 2
  4928. coordenadas_completas 1 9 80 24
  4929. ""
  4930. "La directiva del preprocesador #error fuerza al compilador a parar la"
  4931. "compilación y escribir un mensaje de error."
  4932. ""
  4933. "Tiene la forma general:"
  4934. ""
  4935. "  ~#error mensaje~"
  4936. begint
  4937. ""
  4938. "Ver un ejemplo de esta directiva al final de la descripción de las"
  4939. "directivas #if, #else, #elif y #endif."
  4940. endt
  4941. endvis
  4942. beginvis
  4943. cabecera " DIRECTIVAS #if, #else, #elif y #endif "
  4944. color 14 1
  4945. borde 2
  4946. coordenadas_completas 1 9 80 24
  4947. "Estas directivas permiten compilar selectivamente parte del código fuente"
  4948. "de un programa. Este proceso se llama compilación condicional."
  4949. ""
  4950. "La forma general del bloque #if es:"
  4951. ""
  4952. "  ~#if expresion_constante  ~"
  4953. "  ~  secuencia de sentencias~"
  4954. "  ~#endif                   ~"
  4955. ""
  4956. "y la forma del bloque #if-#else es:"
  4957. ""
  4958. "  ~#if expresion_constante  ~"
  4959. "  ~  secuencia de sentencias~"
  4960. "  ~#else                    ~"
  4961. "  ~  secuencia de sentencias~"
  4962. "  ~#endif                   ~"
  4963. ""
  4964. "La expresión que sigue a #if se evalúa en tiempo de compilación, por eso"
  4965. "ha de ser una expresión constante (que no contiene variables). Si la eva-"
  4966. "luación de la expresión es cierta, es decir, es 1, entonces se compilan"
  4967. "la secuencia de sentencias que le siguen; en caso contrario, se compila"
  4968. "la secuencia de sentencias siguientes al #else si existe, o las sentencias"
  4969. "siguientes al #endif si no hay #else."
  4970. ""
  4971. "Ejemplo del bloque #if:"
  4972. ""
  4973. "  ~#if SISTEMA == IBM~"
  4974. "  ~  #include "ibm.h"~"
  4975. "  ~#endif            ~"
  4976. ""
  4977. "Ejemplo del bloque #if-#else:"
  4978. ""
  4979. "  ~#include <stdio.h>         ~"
  4980. "  ~#define MAX 10             ~"
  4981. "  ~main ()                    ~"
  4982. "  ~{                          ~"
  4983. "  ~  #if MAX > 100            ~"
  4984. "  ~    puts ("Compilación 1");~"
  4985. "  ~  #else                    ~"
  4986. "  ~    puts ("Compilación 2");~"
  4987. "  ~  #endif                   ~"
  4988. "  ~}                          ~"
  4989. ""
  4990. "La directiva #elif quiere decir else if y establece una escala del tipo"
  4991. "if-else-if para opciones de compilación múltiples. La directiva #elif, al"
  4992. "igual que la #if, va seguida de una expresión constante. Si la expresión"
  4993. "es cierta, ese bloque de código se compila y no se comprueba ninguna ex-"
  4994. "presión #elif más. En otro caso, se comprueba el bloque siguiente de la"
  4995. "serie."
  4996. ""
  4997. "La forma general de una secuencia #elif es:"
  4998. ""
  4999. "  ~#if expresión              ~"
  5000. "  ~  secuencia de sentencias  ~"
  5001. "  ~#elif expresión 1          ~"
  5002. "  ~  secuencia de sentencias 1~"
  5003. "  ~#elif expresión 2          ~"
  5004. "  ~  secuencia de sentencias 2~"
  5005. "  ~#elif expresión 3          ~"
  5006. "  ~  secuencia de sentencias 3~"
  5007. "  ~.                          ~"
  5008. "  ~.                          ~"
  5009. "  ~.                          ~"
  5010. "  ~#elif expresión N          ~"
  5011. "  ~  secuencia de sentencias N~"
  5012. "  ~#endif                     ~"
  5013. ""
  5014. "Las directivas #if y #elif se pueden anidar."
  5015. ""
  5016. "Ejemplo:"
  5017. ""
  5018. "  ~#if X > Y       ~"
  5019. "  ~  #if X > Z     ~"
  5020. "  ~    int xyz = 1;~"
  5021. "  ~  #elif         ~"
  5022. "  ~    int xyz = 2;~"
  5023. "  ~  #endif        ~"
  5024. "  ~#else           ~"
  5025. "  ~  int xyz = 3;  ~"
  5026. "  ~#endif          ~"
  5027. ""
  5028. "La expresión constante puede contener también el operador sizeof."
  5029. begint
  5030. ""
  5031. "En Turbo C, existe un operador, ~defined~, que puede ser utilizada en las"
  5032. "expresiones de estas directivas."
  5033. ""
  5034. "La forma general es:"
  5035. ""
  5036. "  ~defined identificador~"
  5037. "  o"
  5038. "  ~defined (identificador)~"
  5039. ""
  5040. "La expresión formada por este operador es 1 si identificador ha sido pre-"
  5041. "viamente definido (usando #define) y no ha sido después indefinido (usando"
  5042. "#undef). En otro caso, este operador devuelve 0."
  5043. ""
  5044. "Este operador sólo puede ser utilizado en las directivas #if y #elif."
  5045. ""
  5046. "Ejemplo 1:"
  5047. ""
  5048. "  ~#if defined(X)                        ~"
  5049. "  ~  v = 1;                              ~"
  5050. "  ~#elif defined(Y)                      ~"
  5051. "  ~  v = 2;                              ~"
  5052. "  ~#else                                 ~"
  5053. "  ~  #error Ni X ni Y han sido definidos.~"
  5054. "  ~#endif                                ~"
  5055. ""
  5056. "Ejemplo 2:"
  5057. ""
  5058. "  ~#if !defined(MODELO)       ~"
  5059. "  ~  #error Modelo no definido~"
  5060. "  ~#endif                     ~"
  5061. endt
  5062. endvis
  5063. beginvis
  5064. cabecera " DIRECTIVAS #ifdef y #ifndef "
  5065. color 14 1
  5066. borde 2
  5067. coordenadas_completas 1 9 80 24
  5068. "Estas directivas, al igual que las #if y #elif, son directivas de compila-"
  5069. "ción condicional."
  5070. ""
  5071. "La forma general de #ifdef es:"
  5072. ""
  5073. "  ~#ifdef identificador     ~"
  5074. "  ~  secuencia de sentencias~"
  5075. "  ~#endif                   ~"
  5076. ""
  5077. "#ifdef significa «si definido». Si se ha definido previamente identificador"
  5078. "en una sentencia #define, se compila el bloque de código que sigue a la"
  5079. "sentencia."
  5080. ""
  5081. "Ejemplo:"
  5082. ""
  5083. "  ~#ifdef DEBUG                             ~"
  5084. "  ~  printf ("Espacio total %d\n", espacio);~"
  5085. "  ~#endif                                   ~"
  5086. ""
  5087. "La forma general es #ifndef es:"
  5088. ""
  5089. "  ~#ifndef identificador    ~"
  5090. "  ~  secuencia de sentencias~"
  5091. "  ~#endif                   ~"
  5092. ""
  5093. "#ifndef significa «si no definido». Si no se ha definido previamente iden-"
  5094. "tificador mediante una sentencia #define, se compila el bloque de código."
  5095. ""
  5096. "Ejemplo:"
  5097. ""
  5098. "  ~#ifndef ABC                  ~"
  5099. "  ~  printf ("ABC no definido");~"
  5100. "  ~#endif                       ~"
  5101. endvis
  5102. beginvis
  5103. cabecera " DIRECTIVA #line "
  5104. color 14 1
  5105. borde 2
  5106. coordenadas_completas 1 9 80 24
  5107. "La directiva #line hace que el compilador crea que el número de línea de la"
  5108. "próxima línea a la que está esta directiva, sea la dada por <constante>, y"
  5109. "el fichero de entrada corriente sea el dado por <identificador>."
  5110. ""
  5111. "La forma general es:"
  5112. ""
  5113. "  ~#line <constante> [<identificador>]~"
  5114. ""
  5115. "Si <identificador> no es un nombre correcto de fichero, el nombre del fi-"
  5116. "chero corriente no es cambiado."
  5117. ""
  5118. "Ejemplo:"
  5119. ""
  5120. "  ~#line 100                     /* reinicializa el contador de líneas */~"
  5121. "  ~main ()                       /* línea 100 */                         ~"
  5122. "  ~{                             /* línea 101 */                         ~"
  5123. "  ~  printf ("%d\n", __LINEA__); /* línea 102 */                         ~"
  5124. "  ~}                             /* línea 103 */                         ~"
  5125. ""
  5126. "__LINE__ es una macro predefinida que contiene el número de la línea de"
  5127. "código fuente actual."
  5128. ""
  5129. "__FILE__ es una macro predefinida que contiene el nombre del fichero fuente"
  5130. "actual."
  5131. ""
  5132. "La macro #line lo que hace es cambiar los contenidos de estas dos macros."
  5133. endvis
  5134. beginvis
  5135. cabecera " DIRECTIVA #pragma "
  5136. color 14 1
  5137. borde 2
  5138. coordenadas_completas 1 9 80 24
  5139. "La directiva #pragma es una directiva definida por la implementación que"
  5140. "permite que se den varias instrucciones al compilador."
  5141. ""
  5142. "La forma general es:"
  5143. ""
  5144. "  ~#pragma <nombre_de_directiva>~"
  5145. ""
  5146. "Las instrucciones que se dan con esta directiva son dependientes del"
  5147. "compilador."
  5148. begint
  5149. ""
  5150. "Esto también ocurre con cada versión de Turbo C. Comprueba el manual de"
  5151. "usuario o la ayuda del entorno integrado de los distintos compiladores de"
  5152. "Turbo C para los detalles y opciones de esta directiva."
  5153. endt
  5154. endvis
  5155. beginvis
  5156. cabecera " NOMBRES DE MACROS PREDEFINIDAS "
  5157. color 14 1
  5158. borde 2
  5159. coordenadas_completas 1 9 80 24
  5160. "El estándar ANSI propone cinco macros predefinidas:"
  5161. ""
  5162. "  Macro    Tipo      Qué contiene"
  5163. "  -------- --------- ------------------------------------------------------"
  5164. ""
  5165. "  ~__DATE__~ Literal   Contiene una cadena de la forma mes/día/año que en la"
  5166. "           string    fecha de conversión del código fuente a código fuente"
  5167. ""
  5168. "  ~__FILE__~ Literal   Contiene una cadena con el nombre del fichero fuente"
  5169. "           string    actual"
  5170. ""
  5171. "  ~__LINE__~ Constante Contiene el número de la línea actual del fichero"
  5172. "           decimal   fuente que está siendo procesado"
  5173. ""
  5174. "  ~__STDC__~ Constante Contiene un 1 si la implementación es estándar y"
  5175. "                     cualquier otro número si la implementación varía de"
  5176. "                     la estándar"
  5177. ""
  5178. "  ~__TIME__~ Literal   Contiene una cadena de la forma horas:minutos:segundos"
  5179. "           string    que es la hora de conversión del código fuente al"
  5180. "                     código objeto"
  5181. ""
  5182. "Ejemplo:"
  5183. ""
  5184. "  ~/*                                       ~"
  5185. "  ~  Fichero EJ.C: Programa ejemplo para    ~"
  5186. "  ~  probar las constantes predefinidas     ~"
  5187. "  ~*/                                       ~"
  5188. "  ~                                         ~"
  5189. "  ~void main (void)                         ~"
  5190. "  ~{                                        ~"
  5191. "  ~  #include <stdio.h>                     ~"
  5192. "  ~                                         ~"
  5193. "  ~  printf ("\n__DATE__ : %s", __DATE__);  ~"
  5194. "  ~  printf ("\n__FILE__ : %s", __FILE__);  ~"
  5195. "  ~  printf ("\n__LINE__ : %d", __LINE__);  ~"
  5196. "  ~  printf ("\n__TIME__ : %s", __TIME__);  ~"
  5197. "  ~                                         ~"
  5198. "  ~  #ifdef __STDC__                        ~"
  5199. "  ~    printf ("\n__STDC__ : %d", __STDC__);~"
  5200. "  ~  #endif                                 ~"
  5201. "  ~}                                        ~"
  5202. ""
  5203. "La salida de este programa en mi implementación es:"
  5204. ""
  5205. "~__DATE__ : Feb 23 1993~"
  5206. "~__FILE__ : EJ.C~"
  5207. "~__LINE__ : 12~"
  5208. "~__TIME__ : 16:20:59~"
  5209. begint
  5210. ""
  5211. "Las versiones de Turbo C tienen bastante más constantes simbólicas prede-"
  5212. "finidas pero como varían en cada sección, no son muy utilizadas por el"
  5213. "usuario medio y requieren conocimientos más profundos del sistema que"
  5214. "hasta aquí citados, no las vamos a ver. Consulta el manual de usuario o"
  5215. "la ayuda del entorno integrado del compilador de Turbo C que usas."
  5216. ""
  5217. "Aunque hay una en todas las versiones de Turbo C que sí es útil: ~__TURBOC__~."
  5218. "El valor de esta macro es distinto para cada versión de Turbo C, por lo"
  5219. "tanto, tiene dos usos principales: 1) Para saber si estamos compilando en"
  5220. "Turbo C o en cualquier otro compilador. 2) Para saber con qué versión de"
  5221. "Turbo C estamos compilando."
  5222. ""
  5223. "Ejemplo:"
  5224. ""
  5225. "  ~#ifdef __TURBOC__                                           ~"
  5226. "  ~  #include <conio.h> /* highvideo (), cputs () */           ~"
  5227. "  ~  #define alta_intensidad() highvideo()                     ~"
  5228. "  ~  #define escribir(cadena) cputs(cadena)                    ~"
  5229. "  ~#else                                                       ~"
  5230. "  ~  #include <stdio.h> /* puts () */                          ~"
  5231. "  ~  #define alta_intensidad()                                 ~"
  5232. "  ~  #define escribir(cadena) puts(cadena)                     ~"
  5233. "  ~#endif                                                      ~"
  5234. "  ~                                                            ~"
  5235. "  ~void main (void)                                            ~"
  5236. "  ~{                                                           ~"
  5237. "  ~  alta_intensidad (); /* se expande a nada si no Turbo C */ ~"
  5238. "  ~  escribir ("Este mensaje está en alta intensidad ");       ~"
  5239. "  ~  escribir ("si está compilado en Turbo C.");               ~"
  5240. "  ~}                                                           ~"
  5241. ""
  5242. "El ejemplo anterior se puede compilar en cualquier compilador de C, pero"
  5243. "si se compila en uno de Borland el mensaje aparecerá en alta intensidad y"
  5244. "si se compila en cualquier otro aparecerá con intensidad normal."
  5245. endt
  5246. endvis
  5247. end lección 5
  5248.  
  5249. ; LECCION 6
  5250. begin
  5251. beginv
  5252. borde 2
  5253. color 1 7
  5254. centrar_coordenadas
  5255. cabecera " INTRODUCCION A LA LECCION 6 "
  5256. "~                                                               ~"
  5257. "~ El objetivo de esta lección es hacer un estudio completo en   ~"
  5258. "~ todo lo referente a la declaración, utilización e inicializa- ~"
  5259. "~ ción de arrays, tanto unidimensionales, bidimensionales como  ~"
  5260. "~ multidimensionales.                                           ~"
  5261. "~                                                               ~"
  5262. ""
  5263. "Los puntos que detallaremos son:"
  5264. ""
  5265. "  - Definición del concepto de array."
  5266. "  - Arrays unidimensionales (vectores). Cadenas de caracteres."
  5267. "  - Arrays bidimensionales (matrices). Arrays de cadenas."
  5268. "  - Arrays multidimensionales."
  5269. "  - Arrays y punteros."
  5270. "  - Inicialización de arrays."
  5271. ""
  5272. endv
  5273. borrar_pantalla
  5274. beginv
  5275. coordenadas 1 2
  5276. cabecera " ARRAYS "
  5277. color 15 2
  5278. "~Un array es una colección de variables del mismo~"
  5279. "~tipo que se referencia por un nombre común.~"
  5280. ""
  5281. pulsación
  5282. "A un elemento específico de un array se accede"
  5283. "mediante un índice. En C todos los arrays constan"
  5284. "de posiciones de memoria contiguas. La dirección"
  5285. "más baja corresponde al primer elemento y la"
  5286. "dirección más alta al último elemento. Los arrays"
  5287. "pueden tener de una a varias dimensiones."
  5288. endv
  5289. beginv
  5290. coordenadas 3 6
  5291. cabecera " ARRAYS UNIDIMENSIONALES "
  5292. color 15 3
  5293. "La forma general de declaración de un array unidimensional es:"
  5294. ""
  5295. "  ~especificador_de_tipo  nombre_variable  [tamaño];~"
  5296. ""
  5297. "donde especificador_de_tipo es el tipo base, es decir, el tipo"
  5298. "de cada elemento y tamaño es el número de elementos del array."
  5299. ""
  5300. pulsación
  5301. "La forma general de acceder a un elemento del array es:"
  5302. ""
  5303. "  ~nombre_variable [indice]~"
  5304. ""
  5305. pulsación
  5306. "La longitud en bytes de un array se calcula mediante la fórmula:"
  5307. ""
  5308. "  ~total_de_bytes = sizeof (tipo) * numero_de_elementos~"
  5309. endv
  5310. beginv
  5311. coordenadas 5 7
  5312. cabecera " INDICES DE LOS ARRAYS UNIDIMENSIONALES "
  5313. "En C todas los arrays tienen el cero como índice de su primer"
  5314. "elemento. Por tanto, cuando se escribe"
  5315. ""
  5316. "  ~char v[10];~"
  5317. ""
  5318. "se está declarando un array de 10 elementos de tipo entero y el"
  5319. "array va de ~v[0] a v[9]~."
  5320. ""
  5321. pulsación
  5322. "C no comprueba los límites de los arrays. Esto quiere decir que si"
  5323. "hacemos v[20] para el array anterior, el C no nos va a informar de"
  5324. "ningún error. Es responsabilidad del programador el indexamiento"
  5325. "correcto de un array."
  5326. endv
  5327. beginv
  5328. coordenadas 7 8
  5329. cabecera " PASO DE ARRAYS UNIDIMENSIONALES COMO PARAMETROS "
  5330. ""
  5331. " Hay tres formas de pasar un array unidimensional como parámetro a "
  5332. " una función. Consultar el apartado 'ARGUMENTOS DE LAS FUNCIONES'"
  5333. " de la lección anterior para recordar cuáles son las tres formas."
  5334. ""
  5335. endv
  5336. beginv
  5337. coordenadas_completas 9 9 78 23
  5338. cabecera " UTILIZACION DE ARRAYS UNIDIMENSIONALES COMO CADENAS "
  5339. ""
  5340. "El uso más común de los arrays unidimensionales es, con mucho, co-"
  5341. "mo cadena de caracteres. ~En C una cadena se define como un array~"
  5342. "~de caracteres que termina en un carácter nulo~. Un carácter nulo"
  5343. "se especifica como '\0' y generalmente es un cero. Por esta razón,"
  5344. "para declarar arrays de caracteres es necesario que sean de un"
  5345. "carácter más que la cadena más larga que pueda contener."
  5346. ""
  5347. pulsación
  5348. "Por ejemplo, si se desea declarar un array s para contener una"
  5349. "cadena de ~10~ caracteres, se escribirá"
  5350. ""
  5351. "  char s[~11~];"
  5352. ""
  5353. endv
  5354. beginv
  5355. coordenadas_completas 9 9 78 23
  5356. cabecera " UTILIZACION DE ARRAYS UNIDIMENSIONALES COMO CADENAS "
  5357. ""
  5358. "En C, todo lo que esté encerrado entre comillas es una constante"
  5359. "de cadena. Por ejemplo:"
  5360. ""
  5361. "  "cadena""
  5362. ""
  5363. "~En las constantes de cadenas no es necesario añadir explícitamente~"
  5364. "~el carácter nulo~, pues el compilador de C lo hace autómaticamente."
  5365. endv
  5366. beginv
  5367. coordenadas 3 6
  5368. cabecera " ARRAYS BIDIMENSIONALES "
  5369. color 15 5
  5370. ""
  5371. " Un array bidimensional es, en realidad, un array unidimensional donde"
  5372. " cada elemento es otro array unidimensional. Los arrays bidimensionales "
  5373. " son un caso particular de los arrays multidimensionales."
  5374. ""
  5375. pulsación
  5376. " Así como a los arrays unidimensionales se les suele llamar ~vectores~,"
  5377. " a los arrays bidimensionales se les suele llamar ~matrices.~"
  5378. ""
  5379. pulsación
  5380. " La forma general de declaración es:"
  5381. ""
  5382. "   ~especificador_de_tipo nombre_variable [tamaño_1] [tamaño_2];~"
  5383. ""
  5384. " y se accede a los elementos del array:"
  5385. ""
  5386. "   ~nombre_variable [indice_1] [indice_2]~"
  5387. ""
  5388. endv
  5389. beginv
  5390. coordenadas 5 7
  5391. cabecera " EJEMPLO DE ARRAY BIDIMENSIONAL "
  5392. no_sombra
  5393. "  void main (void)"
  5394. "  {"
  5395. "    #include <stdio.h>"
  5396. "    #define num_filas    4"
  5397. "    #define num_columnas 7"
  5398. "    int i, j, matriz [num_filas] [num_columnas]; "
  5399. "    for (i = 0; i < num_filas; i++)"
  5400. "      for (j = 0; j < num_columnas; j++)"
  5401. "        matriz[i][j] = i + j;"
  5402. "    for (i = 0; i < num_filas; i++)"
  5403. "      {"
  5404. "        for (j = 0; j < num_columnas; j++)"
  5405. "          printf ("%2d ", matriz[i][j]);"
  5406. "        putchar ('\n');"
  5407. "      }"
  5408. "  }"
  5409. endv
  5410. beginv
  5411. coordenadas_completas 58 7 80 12
  5412. cabecera " SALIDA DEL EJEMPLO "
  5413. no_sombra
  5414. "0  1  2  3  4  5  6"
  5415. "1  2  3  4  5  6  7"
  5416. "2  3  4  5  6  7  8"
  5417. "3  4  5  6  7  8  9"
  5418. endv
  5419. beginv
  5420. coordenadas 7 8
  5421. cabecera " TAMAÑO EN BYTES DE UN ARRAY BIDIMENSIONAL "
  5422. ""
  5423. " El tamaño en bytes de una matriz se calcula mediante la fórmula "
  5424. ""
  5425. "       ~bytes_de_memoria = fila * columna * sizeof (tipo)~"
  5426. ""
  5427. endv
  5428. beginv
  5429. coordenadas 9 10
  5430. cabecera " PASO DE UN ARRAY BIDIMENSIONAL COMO ARGUMENTO A UNA FUNCION "
  5431. ""
  5432. "El nombre de un array bidimensional es un puntero al primer elemento"
  5433. "del array ([0][0]). Para pasar un array bidimensional como argumento"
  5434. "a una función se pasa el puntero al primer elemento. Sin embargo, la"
  5435. "función que recibe un array bidimensional como parámetro tiene que"
  5436. "definir al menos la longitud de la segunda dimensión. Esto es nece-"
  5437. "sario debido a que el compilador de C necesita «conocer» la longitud"
  5438. "de cada fila para indexar el array correctamente."
  5439. ""
  5440. endv
  5441. beginv
  5442. coordenadas_completas 5 7 74 24
  5443. cabecera " MISMO EJEMPLO DE ANTES PERO CON ARRAYS COMO ARGUMENTOS "
  5444. no_sombra
  5445. "  #include <stdio.h>"
  5446. ""
  5447. "  #define num_filas 4"
  5448. "  #define num_columnas 7"
  5449. ""
  5450. "  void rellenar_matriz (int m[][]), imprimir_matriz (int m[][]);  "
  5451. ""
  5452. "  int i, j;"
  5453. ""
  5454. "  void main (void)"
  5455. "  {"
  5456. "    int matriz [num_filas] [num_columnas];"
  5457. ""
  5458. "    rellenar_matriz (matriz);"
  5459. "    imprimir_matriz (matriz);"
  5460. "  }"
  5461. endv
  5462. beginv
  5463. coordenadas_completas 5 7 74 24
  5464. cabecera " MISMO EJEMPLO DE ANTES PERO CON ARRAYS COMO ARGUMENTOS "
  5465. no_sombra
  5466. "  void rellenar_matriz (int m[][num_columnas])"
  5467. "  {"
  5468. "    for (i = 0; i < num_filas; i++)"
  5469. "      for (j = 0; j < num_columnas; j++)"
  5470. "        m[i][j] = i + j;"
  5471. "  }"
  5472. ""
  5473. "  void imprimir_matriz (int m[][num_columnas])"
  5474. "  {"
  5475. "    for (i = 0; i < num_filas; i++)"
  5476. "      {"
  5477. "        for (j = 0; j < num_columnas; j++)"
  5478. "          printf ("%2d ", m[i][j]);"
  5479. "        putchar ('\n');"
  5480. "      }"
  5481. "  }"
  5482. endv
  5483. beginv
  5484. coordenadas_completas 5 7 74 23
  5485. cabecera " ARRAY DE CADENAS "
  5486. "En C es necesario a veces la utilización de un array de cadenas."
  5487. "Recordar el argv de la función main visto en la lección anterior."
  5488. ""
  5489. pulsación
  5490. "Ejemplo de declaración de un array de 100 elementos en el que cada"
  5491. "elemento va a contener una cadena de caracteres de 50 caracteres"
  5492. "como máximo:"
  5493. "  ~char array_de_cadena [100] [51];~"
  5494. ""
  5495. pulsación
  5496. "El acceso a una cadena del ejemplo anterior se hace:"
  5497. "  ~array_de_cadena[indice]~"
  5498. "o"
  5499. "  ~&array_de_cadena[indice][0]~"
  5500. ""
  5501. pulsación
  5502. "Y el acceso a un carácter de una de las cadenas:"
  5503. "  ~array_de_cadena[indice_1][indice_2]~"
  5504. endv
  5505. beginv
  5506. coordenadas_completas 5 7 74 23
  5507. cabecera " ARRAY DE CADENAS "
  5508. "void main (void)"
  5509. "{"
  5510. "  #include <stdio.h>"
  5511. "  #define NUM_CADENAS 3"
  5512. "  #define LONG_MAX_CADENA 81"
  5513. "  register int i;"
  5514. "  char cadenas [NUM_CADENAS] [LONG_MAX_CADENA];"
  5515. "  puts ("\nINTRODUCCION DE CADENAS:\n");"
  5516. "  for ( i = 0; i < NUM_CADENAS; i++)"
  5517. "    printf ("Cadena %d: ", i), gets (cadenas[i]);"
  5518. "  puts ("LISTADO DE CADENAS INTRODUCIDAS:\n");"
  5519. "  for (i = 0; i < NUM_CADENAS; i++)"
  5520. "    printf ("\nCadena %d: %s", i, cadenas[i]);"
  5521. "}"
  5522. endv
  5523. beginv
  5524. coordenadas 3 6
  5525. cabecera " ARRAYS MULTIDIMENSIONALES "
  5526. color 15 4
  5527. "C permite arrays de más de dos dimensiones. El límite exacto, si lo"
  5528. "hay, viene determinado por el compilador."
  5529. ""
  5530. pulsación
  5531. "La forma general de declaración de un array multidimensional es:"
  5532. ""
  5533. "  ~especificador_de_tipo nombre_array [tam_1] [tam_2] ... [tam_n];~"
  5534. ""
  5535. "NOTA: tam_1, tam_2, ..., tam_n han de ser expresiones constantes."
  5536. ""
  5537. pulsación
  5538. "La forma general de acceso es:"
  5539. ""
  5540. "  ~nombre_array [ind_1] [ind_2] ... [ind_n]~"
  5541. endv
  5542. beginv
  5543. coordenadas 5 7
  5544. cabecera " PASO DE ARRAYS MULTIDIMENSIONALES COMO ARGUMENTOS A FUNCIONES "
  5545. "Cuando se pasan arrays multidimensionales a funciones, se tiene que"
  5546. "declarar todo excepto la primera dimensión. Por ejemplo, si se de-"
  5547. "clara am como"
  5548. ""
  5549. "  int am [4] [3] [6] [5];"
  5550. ""
  5551. "entonces la función que reciba am podría ser como esta:"
  5552. ""
  5553. "  void func (int a [] [3] [6] [5])"
  5554. "  {"
  5555. "    /* ... */"
  5556. "  }"
  5557. ""
  5558. "Por supuesto, si se quiere se puede incluir la primera dimensión."
  5559. endv
  5560. beginv
  5561. centrar_coordenadas
  5562. cabecera "    A R R A Y S    Y    P U N T E R O S    "
  5563. color 15 6
  5564. ""
  5565. "  En C los punteros y los arrays están estrechamente  "
  5566. "  relacionados. Por ejemplo, un nombre de array es"
  5567. "  un puntero al primer elemento del array."
  5568. ""
  5569. "  Ejemplo:"
  5570. ""
  5571. "    ~void main (void)                         ~"
  5572. "    ~{                                        ~"
  5573. "    ~  #include <stdio.h>                     ~"
  5574. "    ~  char p[10];                            ~"
  5575. "    ~  printf ("p == &p[0] : %d", p == &p[0]);~"
  5576. "    ~}                                        ~"
  5577. ""
  5578. "  La salida por pantalla de este programa es:"
  5579. ""
  5580. "  ~p == &p[0] : 1~"
  5581. ""
  5582. endv
  5583. beginv
  5584. coordenadas_completas 3 5 80 24
  5585. cabecera " INICIALIZACION DE ARRAYS "
  5586. color 15 1
  5587. ""
  5588. ""
  5589. "  La forma general de inicialización de un array en la que aparece a"
  5590. "  continuación:"
  5591. ""
  5592. "    ~especificador_de_tipo nombre_array [tamaño_1] ... [tamaño_N] =~"
  5593. "    ~  { lista_de_valores };                                       ~"
  5594. ""
  5595. ""
  5596. "  Como se ve, la inicialización de arrays es similar a la inicialización"
  5597. "  de variables."
  5598. ""
  5599. "  La lista_de_valores es una lista de constantes, separadas por comas,"
  5600. "  cuyo tipo es compatible con especificador_de_tipo."
  5601. ""
  5602. "  Después de } ha de haber un ;."
  5603. ""
  5604. endv
  5605. beginv
  5606. coordenadas 5 6
  5607. no_sombra
  5608. "Ejemplo de inicialización de un vector:"
  5609. ""
  5610. "  ~int v[5] = { 1, 2, 3, 4, 5 };~"
  5611. ""
  5612. "La inicialización de cadenas se puede hacer de dos formas:"
  5613. ""
  5614. "  ~char cadena[4] = "abc";~   ~char cadena[4] = { 'a', 'b', 'c', '\0' };~ "
  5615. ""
  5616. "Hay dos formas de inicializar arrays multidimensionales:"
  5617. ""
  5618. "  ~int m [3] [4]    ~        ~int m [3] [4]        ~"
  5619. "  ~  {              ~        ~  {                  ~"
  5620. "  ~    1, 2, 3, 4,  ~        ~    { 1, 2, 3, 4 },  ~"
  5621. "  ~    5, 6, 7, 8,  ~        ~    { 5, 6, 7, 8 },  ~"
  5622. "  ~    9, 10, 11, 12~        ~    { 9, 10, 11, 12 }~"
  5623. "  ~  };             ~        ~  };                 ~"
  5624. endv
  5625. beginv
  5626. coordenadas 7 7
  5627. no_sombra
  5628. " No es necesario que estén todos los elementos en las inicializa- "
  5629. " ciones de arrays. Los elementos que falten se inicializan a 0 o"
  5630. " quedan sin valor fijo, según el compilador. Por ejemplo:"
  5631. ""
  5632. "   ~int v[5] = { 1, 2 };~"
  5633. ""
  5634. " Observar que no se asigna los mismos valores a m1 que a m2 en el"
  5635. " siguiente ejemplo:"
  5636. "    ~int m1 [3] [2]~     ~int m2 [3] [2]~    El valor 5 se asigna"
  5637. "    ~  {           ~     ~  {           ~    en el primer caso a"
  5638. "    ~    2, 3,     ~     ~    { 2, 3 }, ~    m1[1][1] y en el se-"
  5639. "    ~    4,        ~     ~    { 4 },    ~    gundo caso a m2[2][0]."
  5640. "    ~    5, 6      ~     ~    { 5, 6 }  ~"
  5641. "    ~  };          ~     ~  };          ~"
  5642. endv
  5643. beginv
  5644. coordenadas 9 8
  5645. no_sombra
  5646. "La forma más común de inicialización de arrays es sin especi-"
  5647. "ficar el tamaño. Por ejemplo:"
  5648. ""
  5649. "  ~int v [] = { 2, 3, 4 };~"
  5650. ""
  5651. "En este ejemplo, el compilador reserva memoria para los ele-"
  5652. "mentos de v: v[0], v[1] y v[2], y les asigna los valores 2, 3 "
  5653. "y 4 respectivamente."
  5654. ""
  5655. "Otro ejemplo:"
  5656. ""
  5657. "  ~char cadena [] = "esto es una cadena de prueba";~"
  5658. endv
  5659. beginv
  5660. coordenadas 11 9
  5661. no_sombra
  5662. "En los arrays multidimensionales es necesario especificar "
  5663. "el tamaño de todas las dimensiones excepto el de la pri-"
  5664. "mera que es opcional."
  5665. ""
  5666. "Ejemplo:"
  5667. "  ~int m [] [4] =    ~"
  5668. "  ~ {                ~"
  5669. "  ~   { 1, 2, 3, 4 },~"
  5670. "  ~   { 5, 6, 7, 8 } ~"
  5671. "  ~ };               ~"
  5672. endv
  5673. beginv
  5674. coordenadas 13 10
  5675. no_sombra
  5676. ""
  5677. " La ventaja de las inicializaciones de arrays sin es-"
  5678. " pecificar tamaño es que se puede insertar y quitar"
  5679. " elementos sin modificar las dimensiones del array."
  5680. " Otra ventaja es que nosotros no tenemos que contar"
  5681. " todos los elementos del array para dimensionarlo, así"
  5682. " que dejamos que esta tarea la realice el compilador."
  5683. ""
  5684. endv
  5685. beginv
  5686. centrar_coordenadas
  5687. cabecera " EJEMPLO "
  5688. color 14 3
  5689. "#include <stdio.h>"
  5690. "void main (void)"
  5691. "{"
  5692. "  /*"
  5693. "    si en tu compilador da problema las dos inicializaciones de arrays"
  5694. "    que se van a definir, lo puede solucionar de dos formas: o bien"
  5695. "    haces estos dos arrays globales o los hace locales estáticos"
  5696. "  */"
  5697. "  char meses[12][11] ="
  5698. "    {"
  5699. "      "Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio","
  5700. "      "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre""
  5701. "    };"
  5702. "  int dias[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };"
  5703. "  register short i;"
  5704. "  for (i = 0; i < 12; i++)"
  5705. "    printf ("El mes de %-10s tiene %d días.\n", meses[i], dias[i]);"
  5706. "}"
  5707. endv
  5708. beginv
  5709. centrar_coordenadas
  5710. cabecera " SALIDA DE LA EJECUCION DE ESTE EJEMPLO "
  5711. ""
  5712. "  El mes de Enero      tiene 31 días.  "
  5713. "  El mes de Febrero    tiene 28 días."
  5714. "  El mes de Marzo      tiene 31 días."
  5715. "  El mes de Abril      tiene 30 días."
  5716. "  El mes de Mayo       tiene 31 días."
  5717. "  El mes de Junio      tiene 30 días."
  5718. "  El mes de Julio      tiene 31 días."
  5719. "  El mes de Agosto     tiene 31 días."
  5720. "  El mes de Septiembre tiene 30 días."
  5721. "  El mes de Octubre    tiene 31 días."
  5722. "  El mes de Noviembre  tiene 30 días."
  5723. "  El mes de Diciembre  tiene 31 días."
  5724. ""
  5725. endv
  5726. end lección 6
  5727.  
  5728. ; LECCION 7
  5729. begin
  5730. beginv
  5731. borde 2
  5732. color 1 7
  5733. centrar_coordenadas
  5734. cabecera " INTRODUCCION A LA LECCION 7 "
  5735. "~ El objetivo de esta lección es hacer un estudio ~"
  5736. "~ completo en todo lo referente a la declaración, ~"
  5737. "~ utilización e inicialización de punteros.       ~"
  5738. ""
  5739. "Los puntos que detallaremos son:"
  5740. "  - Definición del concepto de puntero."
  5741. "  - Declaración de punteros."
  5742. "  - Operadores de punteros: ~&~ y ~*~."
  5743. "  - Aritmética de punteros."
  5744. "  - Asignación dinámica de memoria."
  5745. "  - Punteros y arrays."
  5746. "  - Inicializaciones de punteros."
  5747. "  - Punteros a funciones."
  5748. "  - Funciones ~qsort()~ y ~bsearch()~."
  5749. begint
  5750. "  - Funciones de Turbo C: ~lfind()~ y ~lsearch()~."
  5751. endt
  5752. "  - Tipo void y punteros."
  5753. "  - Modificador de acceso const y punteros."
  5754. "  - Declaraciones curiosas."
  5755. endv
  5756. borrar_pantalla
  5757. beginv
  5758. cabecera " PUNTEROS "
  5759. borde 2
  5760. color 14 4
  5761. centrar_coordenadas_x 3
  5762. "El concepto de puntero es importantísimo en la programación en C."
  5763. "~Un puntero contiene una dirección de memoria.~"
  5764. "Cuando una variable contiene la dirección de otra variable se"
  5765. "dice que la primera variable apunta a la segunda."
  5766. endv
  5767. beginv
  5768. cabecera " VARIABLES PUNTEROS "
  5769. color 14 2
  5770. centrar_coordenadas_x 10
  5771. "La forma general para declarar una variable puntero es:"
  5772. "                   ~tipo *nombre;~"
  5773. "donde tipo es cualquier tipo válido de C (también llamado"
  5774. "tipo base) y nombre es el nombre de la variable puntero."
  5775. endv
  5776. beginv
  5777. cabecera "OPERADORES DE PUNTEROS "
  5778. color 14 3
  5779. centrar_coordenadas_x 17
  5780. "Existen dos operadores especiales de punteros: ~&~ y ~*~."
  5781. "Estos dos operados son monarios y no tienen nada que"
  5782. "ver con los operadores binarios de multiplicación (*) y"
  5783. "de and a nivel de bits (&)."
  5784. endv
  5785. beginv
  5786. cabecera " OPERADOR & "
  5787. coordenadas_completas 1 2 38 24
  5788. no_sombra
  5789. color 14 1
  5790. ""
  5791. "~  & es un operador monario que  ~"
  5792. "~  devuelve la dirección de me-  ~"
  5793. "~  moria de su operando.         ~"
  5794. ""
  5795. "Ejemplo:"
  5796. ""
  5797. "  #include <stdio.h>"
  5798. "  void main (void)"
  5799. "  {"
  5800. "    int x = 10;"
  5801. "    printf (" x = %d\n &x = %p\n","
  5802. "            x, &x);"
  5803. "  }"
  5804. ""
  5805. "Salida del ejemplo anterior:"
  5806. ""
  5807. " x = 10"
  5808. " &x = 8FBC:0FFE"
  5809. ""
  5810. endv
  5811. beginv
  5812. centrar_coordenadas_y 40
  5813. "NOTA: El valor y formato de las"
  5814. "direcciones de las variables que"
  5815. "se imprimen en esta lección (con"
  5816. "el código de formato %p) son de-"
  5817. "pendientes de la implementación."
  5818. "En mi caso las direcciones se es-"
  5819. "criben en formato segmento:offset,"
  5820. "y el valor de la dirección de una"
  5821. "variable es distinto según cuándo"
  5822. "y desde dónde se ejecute el pro-"
  5823. "grama."
  5824. endv
  5825. beginvis
  5826. no_posicion
  5827. cabecera " OPERADOR * "
  5828. coordenadas_completas 39 2 80 24
  5829. color 14 1
  5830. borde 2
  5831. ""
  5832. "~El operador * es el complemento de ~"
  5833. "~&. Es un operador monario que de-  ~"
  5834. "~vuelve el valor de la variable lo- ~"
  5835. "~calizada en la dirección que sigue.~"
  5836. ""
  5837. "Ejemplo 1:"
  5838. ""
  5839. "  #include <stdio.h>"
  5840. "  void main (void)"
  5841. "  {"
  5842. "    int x = 10;"
  5843. "    printf ("  x = %d\n", x);"
  5844. "    printf ("  *&x = %d", *&x);"
  5845. "  }"
  5846. ""
  5847. "Salida de ejemplo 1:"
  5848. ""
  5849. "  x = 10"
  5850. "  *&x = 10"
  5851. ""
  5852. "Ejemplo 2:"
  5853. ""
  5854. "  #include <stdio.h>"
  5855. "  void main (void)"
  5856. "  {"
  5857. "    int x = 10;"
  5858. "    int *px;"
  5859. "    px = &x;"
  5860. "    printf ("  x = %d\n", x);"
  5861. "    printf ("  &x = %p\n", &x);"
  5862. "    printf ("  px = %p\n", px);"
  5863. "    printf ("  &px = %p\n", &px);"
  5864. "    printf ("  *px = %d", *px);"
  5865. "  }"
  5866. ""
  5867. "Salida de ejemplo 2:"
  5868. ""
  5869. "  x = 10"
  5870. "  &x = 8FC4:0FFE"
  5871. "  px = 8FC4:0FFE"
  5872. "  &px = 8FC4:0FFA"
  5873. "  *px = 10"
  5874. ""
  5875. "Gráficamente:"
  5876. ""
  5877. "  ~     px      ~   ~      x      ~"
  5878. "  ~┌───────────┐~   ~┌───────────┐~"
  5879. "  ~│ 8FC4:0FFE │~   ~│    10     │~"
  5880. "  ~└───────────┘~   ~└───────────┘~"
  5881. "  ~  8FC4:0FFA  ~   ~  8FC4:0FFE  ~"
  5882. ""
  5883. "En el ejemplo anterior se observa que"
  5884. "hay tres valores asociados a los pun-"
  5885. "teros:"
  5886. "  - Dirección en la que se encuentra."
  5887. "  - Dirección a la que apunta."
  5888. "  - Valor contenido en la dirección"
  5889. "    apuntada."
  5890. ""
  5891. "¡¡OJO!! Al ejecutar el siguiente pro-"
  5892. "grama los resultados pueden ser ines-"
  5893. "perados ya que estamos asignando el"
  5894. "valor 10 en una posición de memoria"
  5895. "no reservada:"
  5896. ""
  5897. " void main (void)"
  5898. " {"
  5899. "   int *p;"
  5900. "   *p = 10;"
  5901. " }"
  5902. ""
  5903. "Sería correcto:"
  5904. ""
  5905. " void main (void)"
  5906. " {"
  5907. "   int x;/*se reserva memoria para x*/"
  5908. "   int *p;/*se reserva memoria para la"
  5909. "       variable p, no para la posición"
  5910. "       de memoria a la que apunta p */"
  5911. "   p = &x; /* p apunta a valor de x */"
  5912. "   *p = 10;/* equivalente a: x = 10 */"
  5913. " }"
  5914. ""
  5915. endvis
  5916. borrar_pantalla
  5917. beginv
  5918. cabecera " ARITMETICA DE PUNTEROS "
  5919. color 4 7
  5920. borde 2
  5921. coordenadas 1 2
  5922. "Existen 4 operadores que realizan"
  5923. "operaciones aritméticas que pueden"
  5924. "utilizarse con punteros:"
  5925. "           ~+, -, ++, --~"
  5926. endv
  5927. beginv
  5928. borde 1
  5929. color 9 7
  5930. centrar_coordenadas_y 1
  5931. "/* EJEMPLO DE ARITMETICA DE PUNTEROS */"
  5932. "#include <stdio.h>"
  5933. ""
  5934. "void main (void)"
  5935. "{"
  5936. "  int *p;"
  5937. "  #define imprimir_p printf ("\np = %p", p);"
  5938. ""
  5939. "  imprimir_p;"
  5940. "  printf ("\tsizeof(*p) = %d", sizeof(*p));"
  5941. "  p++; imprimir_p;"
  5942. "  p -= 5; imprimir_p;"
  5943. "}"
  5944. ""
  5945. "/* SALIDA DEL EJEMPLO:"
  5946. "  p = 7203:8D51        sizeof(*p) = 2"
  5947. "  p = 7203:8D53"
  5948. "  p = 7203:8D49"
  5949. "*/"
  5950. endv
  5951. beginvis
  5952. no_posicion
  5953. coordenadas_completas 48 3 78 23
  5954. color 0 7
  5955. borde 1
  5956. ""
  5957. "En el ejemplo anterior se"
  5958. "aprecia que si hacemos p++;"
  5959. "no aumenta el valor de p en"
  5960. "1 sino que aumenta en 2,"
  5961. "que es el tamaño en bytes"
  5962. "de un int, es decir, el"
  5963. "tamaño del objeto al que"
  5964. "apunta."
  5965. ""
  5966. "Por lo tanto, la sentencia"
  5967. "p++ hay que interpretarla"
  5968. "de la siguiente forma: «p"
  5969. "apunta al siguiente elemen-"
  5970. "to del tipo base». Lo mismo"
  5971. "se puede decir de los demás"
  5972. "operadores aritméticos"
  5973. "aplicados a los punteros."
  5974. ""
  5975. ""
  5976. "~Toda la aritmética de pun-~"
  5977. "~teros está en relación con~"
  5978. "~el tipo base del puntero  ~"
  5979. "~por lo que el puntero está~"
  5980. "~siempre apuntando al ele- ~"
  5981. "~mento apropiado del tipo  ~"
  5982. "~base.                     ~"
  5983. ""
  5984. endvis
  5985. borrar_pantalla
  5986. beginvis
  5987. no_posicion
  5988. coordenadas_completas 3 3 78 23
  5989. no_sombra
  5990. cabecera " ASIGNACION DINAMICA DE MEMORIA "
  5991. borde 2
  5992. color 0 2
  5993. "Supóngase que queremos hacer un programa que lea n valores enteros"
  5994. "introducidos por teclado por el usuario, los almacene en un vector"
  5995. "y los imprima en orden inverso."
  5996. ""
  5997. "Una solución es:"
  5998. ""
  5999. "  ~#include <stdio.h>"                                                  ~"
  6000. "  ~                                                                     ~"
  6001. "  ~void main (void)                                                     ~"
  6002. "  ~{                                                                    ~"
  6003. "  ~  #define NMAX 100 /* número máximo de elementos */                  ~"
  6004. "  ~  int v[NMAX]; /* vector */                                          ~"
  6005. "  ~  int n = 0; /* número de elementos introducidos */                  ~"
  6006. "  ~  int varaux; /* variable auxiliar */                                ~"
  6007. "  ~  register int i; /* índice */                                       ~"
  6008. "  ~                                                                     ~"
  6009. "  ~  do                                                                 ~"
  6010. "  ~    {                                                                ~"
  6011. "  ~      printf ("\nIntroduce número de valores a leer (1-%d): ", NMAX);~"
  6012. "  ~      scanf ("%d", &n);                                              ~"
  6013. "  ~    } while (n < 1 || n > NMAX);                                     ~"
  6014. "  ~                                                                     ~"
  6015. "  ~  for (i = 0; i <= n - 1; i++)                                       ~"
  6016. "  ~    {                                                                ~"
  6017. "  ~      printf ("Introduce valor %d: ", i);                            ~"
  6018. "  ~      scanf ("%d", &varaux);                                         ~"
  6019. "  ~      v[i] = varaux;                                                 ~"
  6020. "  ~    }                                                                ~"
  6021. "  ~                                                                     ~"
  6022. "  ~  printf ("\n\nValores en orden inverso:\n");                        ~"
  6023. "  ~  for (i = n - 1; i >= 0; i--)                                       ~"
  6024. "  ~    printf ("%d ", v[i]);                                            ~"
  6025. "  ~}                                                                    ~"
  6026. ""
  6027. "Si el usuario introduce como valor de n, el valor 10, estaremos desper-"
  6028. "diciando, si un int ocupa 2 bytes, 90*2 bytes de memoria. Además, el"
  6029. "usuario no puede introducir más de NMAX valores. Estas restricciones"
  6030. "vienen impuestas poque el tamaño de un array en la declaración ha de"
  6031. "ser una expresión constante. La asignación de memoria en este caso se"
  6032. "dice que es estática porque se determina en el momento de la compila-"
  6033. "ción. Cuando la asignación de memoria se determina en tiempo de ejecu-"
  6034. "ción se dice que es asignación dinámica."
  6035. ""
  6036. "Veamos cómo se haría el programa anterior con asignación dinámica y"
  6037. "luego pasamos a explicarlo:"
  6038. ""
  6039. "  ~#include <stdio.h> /* printf (), scanf () */        ~"
  6040. "  ~#include <alloc.h> /* malloc (), free () */         ~"
  6041. "  ~                                                    ~"
  6042. "  ~void main (void)                                    ~"
  6043. "  ~{                                                   ~"
  6044. "  ~  int *v; /* vector */                              ~"
  6045. "  ~  int n = 0; /* número de elementos introducidos */ ~"
  6046. "  ~  int varaux; /* variable auxiliar */               ~"
  6047. "  ~  register int i; /* índice */                      ~"
  6048. "  ~                                                    ~"
  6049. "  ~  printf ("\nIntroduce número de valores a leer: ");~"
  6050. "  ~  scanf ("%d", &n);                                 ~"
  6051. "  ~                                                    ~"
  6052. "  ~  v = (int *) malloc (n * sizeof (int));            ~"
  6053. "  ~  if (v == NULL)                                    ~"
  6054. "  ~    printf ("Memoria insuficiente.");               ~"
  6055. "  ~  else                                              ~"
  6056. "  ~    {                                               ~"
  6057. "  ~      for (i = 0; i <= n - 1; i++)                  ~"
  6058. "  ~        {                                           ~"
  6059. "  ~          printf ("Introduce valor %d: ", i);       ~"
  6060. "  ~          scanf ("%d", &varaux);                    ~"
  6061. "  ~          v[i] = varaux;                            ~"
  6062. "  ~        }                                           ~"
  6063. "  ~                                                    ~"
  6064. "  ~      printf ("\n\nValores en orden inverso:\n");   ~"
  6065. "  ~      for (i = n - 1; i >= 0; i--)                  ~"
  6066. "  ~        printf ("%d ", v[i]);                       ~"
  6067. "  ~                                                    ~"
  6068. "  ~      free (v);                                     ~"
  6069. "  ~    }                                               ~"
  6070. "  ~}                                                   ~"
  6071. ""
  6072. "La primera sentencia de main() es:"
  6073. ""
  6074. "  ~int *v;~"
  6075. ""
  6076. "En esta declaración estamos declarando v como un puntero a entero."
  6077. ""
  6078. "La siguiente línea «extraña» para nostros es:"
  6079. ""
  6080. "  ~v = (int *) malloc (n * sizeof (int));~"
  6081. ""
  6082. "La función malloc reserva memoria; acepta como argumento los bytes de"
  6083. "memoria a reservar y devuelve un puntero al primer byte de la zona de"
  6084. "memoria reservada; los bytes de memoria solicitados los reserva en un"
  6085. "espacio de memoria contiguo. Si no hay suficiente memoria, devuelve"
  6086. "NULL. Un puntero que tiene el valor NULL es un puntero que no apunta"
  6087. "a ningún sitio."
  6088. ""
  6089. "El prototipo de esta función se encuentra en el fichero malloc.h (de"
  6090. "ahí el incluir este fichero en nuestro ejemplo) y es el siguiente:"
  6091. ""
  6092. "  ~void *malloc (unsigned int bytes);~"
  6093. ""
  6094. "Vemos que devuelve un puntero a void; esto quiere decir que devuelve"
  6095. "un puntero que apunta a cualquier tipo base, o dicho de otro modo, un"
  6096. "puntero que apunta a una dirección de memoria sin tener tipo base."
  6097. ""
  6098. "El C de Kernighan y Ritchie, como no tiene tipo void, el prototipo de"
  6099. "esta función es:"
  6100. ""
  6101. "  ~char *malloc (unsigned int bytes);~"
  6102. ""
  6103. "En ambos casos, el tratamiento por parte del usuario de esta función"
  6104. "es exactamente el mismo."
  6105. ""
  6106. "Veamos otra vez la llamada a esta función en nuestro ejemplo:"
  6107. ""
  6108. "  ~v = (int *) malloc (n * sizeof (int));~"
  6109. ""
  6110. "Al valor devuelto por la función malloc (puntero a void o puntero a"
  6111. "char) siempre se le realiza un moldeado (recordad que esto se hacía"
  6112. "con: (tipo)) para adecuarlo al tipo base de nuestro puntero que va"
  6113. "a apuntar a esa zona de memoria reservada. En nuestro caso el molde"
  6114. "es:"
  6115. ""
  6116. "  ~(int *) /* puntero a entero */~"
  6117. ""
  6118. "El argumento que le pasamos a malloc ha de ser el número de bytes de"
  6119. "memoria a reservar. Esto siempre se hace siguiendo la fórmula:"
  6120. ""
  6121. "  ~numero_de_elementos * sizeof (tipo_de_cada_elemento)~"
  6122. ""
  6123. "que traducido a nuestro caso queda:"
  6124. ""
  6125. "  ~n * sizeof (int)~"
  6126. ""
  6127. "Otra forma de hacer lo mismo es:"
  6128. ""
  6129. "  ~n * sizeof (*v)~"
  6130. ""
  6131. "que suele ser muy corriente. Las dos formas son equivalentes."
  6132. ""
  6133. "La memoria asignada por malloc se desasigna con la función free()."
  6134. "Esta memoria asignada no se desasigna al salir del bloque de código"
  6135. "en que fue asignada como ocurre con las variables locales sino con"
  6136. "la función free (liberar) o al terminar el programa. Por lo tanto,"
  6137. "siempre que asignemos memoria con malloc, tenemos que desasignarla"
  6138. "con free cuando ya no nos sea necesaria."
  6139. ""
  6140. "El prototipo de la función free se encuentra en el fichero malloc.h"
  6141. "y es el siguiente:"
  6142. ""
  6143. "  ~void free (void *p);~"
  6144. ""
  6145. "Un puntero a void como parámetro indica que acepta cualquier puntero,"
  6146. "independientemente del tipo base al que apunta. El puntero que se le"
  6147. "pasa a free como argumento ha de ser un puntero que apunta al prin-"
  6148. "cipio de una zona reservad anteriormente por malloc; si no es así,"
  6149. "se puede caer el sistema."
  6150. ""
  6151. "El resto del ejemplo no tiene ya ninguna dificultad."
  6152. ""
  6153. "Hay otra función, en la librería <alloc.h>, equivalente a malloc, que"
  6154. "es la función calloc cuyo prototipo es el siguiente:"
  6155. ""
  6156. "  ~void *calloc (unsigned numero_de_elementos_a_reservar,    ~"
  6157. "  ~              unsigned tamanio_en_bytes_de_cada_elemento);~"
  6158. ""
  6159. "Esta función es igual que malloc con la única diferencia de sus pará-"
  6160. "metros."
  6161. begint
  6162. ""
  6163. "En Turbo C, los prototipos de las funciones malloc(), calloc() y"
  6164. "free(), además de estar en el fichero alloc.h, también están en el"
  6165. "fichero stdlib.h."
  6166. endt
  6167. endvis
  6168. beginv
  6169. cabecera " PUNTEROS Y ARRAYS "
  6170. color 0 6
  6171. borde 2
  6172. centrar_coordenadas_x 2
  6173. "Exite una estrecha relación entre los punteros y los arrays. Ya"
  6174. "hemos dicho en varias ocasiones en lecciones anteriores que el"
  6175. "nombre de un array es un puntero al primer elemento del array."
  6176. endv
  6177. beginv
  6178. borde 1
  6179. color 15 6
  6180. centrar_coordenadas_x 3
  6181. "A cualquier elemento de un array podemos acceder"
  6182. "mediante la aritmética de punteros y viceversa,"
  6183. "cualquier puntero lo podemos indexar con los []:"
  6184. ""
  6185. "Arrays unidimensionales:"
  6186. "  p[i] == *(p+i)"
  6187. "Arrays bidimensionales:"
  6188. "  p[i][j] == *(p+(i*longitud_fila)+k) == *(*(p+i)+j)"
  6189. "Arrays muldimensionaes:"
  6190. "  se sigue cualquiera de los dos procedimientos"
  6191. "  ejemplarizados en los arrays bidimensionales"
  6192. endv
  6193.  
  6194. beginv
  6195. centrar_coordenadas_x 4
  6196. color 0 3
  6197. "  /*"
  6198. "    EJEMPLO DE ACCESO A UN ARRAY CON UN PUNTERO"
  6199. "  */"
  6200. ""
  6201. "  #include <stdio.h>"
  6202. ""
  6203. "  void main (void)"
  6204. "  {"
  6205. "    float v[3] = { 1.1, 2.2, 3.3 };"
  6206. "    printf ("v[1] = %g; *(v+1) = %g", v[1], *(v+1));  "
  6207. "  }"
  6208. ""
  6209. "  /*"
  6210. "    SALIDA POR PANTALLA: v[1] = 2.2; *(v+1) = 2.2"
  6211. "  */"
  6212. endv
  6213. beginv
  6214. centrar_coordenadas_x 5
  6215. "  /* EJEMPLO DE ACCESO A ELEMENTOS INDEXANDO UN PUNTERO CON [] */"
  6216. "  #include <stdio.h> /* printf (), NULL */"
  6217. "  #include <alloc.h> /* malloc (), free () */"
  6218. "  void main (void)"
  6219. "  {"
  6220. "    float *p;"
  6221. "    if ((p = (float *) malloc (3 * sizeof (float))) == NULL)"
  6222. "      printf ("\nERROR: Memoria Insuficiente.");"
  6223. "    else"
  6224. "      {"
  6225. "        *p = 1.1; *(p+1) = 2.2; *(p+3) = 3.3;"
  6226. "        printf ("*(p+1) = %g p[1] = %g", *(p+1), p[1]);"
  6227. "        free (p);"
  6228. "      }"
  6229. "  }"
  6230. "  /* SALIDA: *(p+1) = 2.2; p[1] = 2.2 */"
  6231. endv
  6232. beginv
  6233. color 15 3
  6234. centrar_coordenadas_x 6
  6235. "Los programadores profesionales de C suelen utilizar la notación pun-"
  6236. "tero en vez de la notación array porque es bastante más rápido y más"
  6237. "cómodo, aunque para los no acostrumbrados a esta notación se ve un poco"
  6238. "extraño al principio. Pensad que con notación array, para acceder a un"
  6239. "determinado elemento, el compilador tiene que hacer una serie de cálcu-"
  6240. "los para averiguar en qué posición está, mientras que en la notación"
  6241. "puntero basta con una simple suma. No obstante, cuando el código queda"
  6242. "más claro en la notación array que con la notación puntero es preferible"
  6243. "la primera notación."
  6244. ""
  6245. "Cuando se trabaja con cadenas de caracteres sí se sebe utilizar la nota-"
  6246. "ción puntero, no ya sólo por eficiencia sino también por convención."
  6247. endv
  6248. beginv
  6249. color 0 5
  6250. centrar_coordenadas_x 7
  6251. "Una estructura común en C es el array de punteros. Recordar que el ar-"
  6252. "gumento argv de la función main() es un array de punteros a caracteres."
  6253. ""
  6254. "Hay tres formas equivalentes de declarar el argumento argv en la función"
  6255. "main():"
  6256. ""
  6257. "  main (int argc, char argv[][]);"
  6258. "  main (int argc, char *argv[]);"
  6259. "  main (int argc, char **argv);"
  6260. ""
  6261. "Habrás observado que en la primera declaración no se ha especificado el"
  6262. "tamaño de la segunda dimensión de argv cuando habíamos dicho antes que"
  6263. "era necesario, esto sólo está permitido hacerlo en la función main()."
  6264. endv
  6265. beginv
  6266. color 15 5
  6267. centrar_coordenadas_x 8
  6268. "La declaración para un array de 10 punteros"
  6269. "a int es:"
  6270. ""
  6271. "  int *x[10];"
  6272. ""
  6273. "Para asignar la dirección de una variable"
  6274. "entera llamada var al tercer elemento del"
  6275. "array de punteros, se ecribe:"
  6276. ""
  6277. "  x[2] = &var;"
  6278. ""
  6279. "Para encontrar el valor de var, se escribe:"
  6280. ""
  6281. "  *x[2]"
  6282. endv
  6283. beginv
  6284. centrar_coordenadas_x 9
  6285. color 0 4
  6286. "/* EJEMPLO DE ARRAY DE CADENAS DE CARACTERES */"
  6287. "void error (int numero_de_error)"
  6288. "{"
  6289. "  char *errores [] ="
  6290. "    {"
  6291. "      "error al intentar abrir fichero","
  6292. "      "error al intentar cerrar fichero","
  6293. "      "error al intentar leer de fichero","
  6294. "      "error al intentar escribir en fichero""
  6295. "    };"
  6296. "  printf ("%s", errores[numero_de_error]);"
  6297. "  exit (1);"
  6298. "}"
  6299. endv
  6300. beginv
  6301. centrar_coordenadas_x 10
  6302. color 15 4
  6303. "/*"
  6304. "  Un array de punteros es lo mismo que punteros a punteros."
  6305. "  Este ejemplo comprueba dicha afirmación."
  6306. "*/"
  6307. "#include <stdio.h>"
  6308. "void main (void)"
  6309. "{"
  6310. "  int x, *p, **q;"
  6311. "  x = 10; p = &x; q = &p;"
  6312. "  printf ("x = %d; *p = %d; **q = %d", x, *p, **q);"
  6313. "}"
  6314. "/* Salida: x = 10; *p = 10; **q = 10 */"
  6315. endv
  6316. beginvis
  6317. no_posicion
  6318. no_multiatributo
  6319. coordenadas_completas 1 11 80 24
  6320. color 1 2
  6321. borde 2
  6322. "A continuación vamos a mostrar dos formas de implementar la siguiente"
  6323. "función: la función a implementar acepta como argumentos una matriz de"
  6324. "enteros y un elemento, y devuelve 1 si ese elemento se encuentra en la"
  6325. "matriz o 0 si dicho elemento no se encuentra en la matriz."
  6326. ""
  6327. "  /*"
  6328. "    Las funciones buscar_en_matriz_version_1() y"
  6329. "    buscar_en_matriz_version_2() son equivalentes"
  6330. "    pero la segunda es mucho más eficiente."
  6331. "  */"
  6332. ""
  6333. "  #include <stdio.h>"
  6334. ""
  6335. "  #define N 3"
  6336. ""
  6337. "  int buscar_en_matriz_version_1 (int m[N][N], int x)"
  6338. "  {"
  6339. "    register int i, j;"
  6340. "    int encontrado = 0;"
  6341. ""
  6342. "    for (i = 0; ! encontrado && i < N; i++)"
  6343. "      for (j = 0; ! encontrado && j < N; j++)"
  6344. "        if (m[i][j] == x)"
  6345. "          encontrado = 1;"
  6346. ""
  6347. "    return (encontrado);"
  6348. "  }"
  6349. ""
  6350. "  int buscar_en_matriz_version_2 (int m[N][N], int x)"
  6351. "  {"
  6352. "    register int i;"
  6353. "    int encontrado = 0;"
  6354. "    int *pm = m; /* declara pm como puntero a int y lo hace apuntar a m */"
  6355. ""
  6356. "    for (i = 1; ! encontrado && i <= N*N; i++)"
  6357. "      if (*pm == x)"
  6358. "        encontrado = 1;"
  6359. "      else"
  6360. "        pm++;"
  6361. ""
  6362. "    return (encontrado);"
  6363. "  }"
  6364. ""
  6365. "  void main (void)"
  6366. "  {"
  6367. "    int matriz [N][N] = { { 1, 2, 3 }, { -1, -2, -3 }, { 5, 6, 7 } };"
  6368. "    int resultado_1 = buscar_en_matriz_version_1 (matriz, 6);"
  6369. "    int resultado_2 = buscar_en_matriz_version_1 (matriz, 8);"
  6370. "    int resultado_3 = buscar_en_matriz_version_2 (matriz, 6);"
  6371. "    int resultado_4 = buscar_en_matriz_version_2 (matriz, 8);"
  6372. ""
  6373. "    printf ("\nresultado_1 = %d", resultado_1);"
  6374. "    printf ("\nresultado_2 = %d", resultado_2);"
  6375. "    printf ("\nresultado_3 = %d", resultado_3);"
  6376. "    printf ("\nresultado_4 = %d", resultado_4);"
  6377. "  }"
  6378. ""
  6379. "  /*"
  6380. "    SALIDA:"
  6381. ""
  6382. "    resultado_1 = 1"
  6383. "    resultado_2 = 0"
  6384. "    resultado_3 = 1"
  6385. "    resultado_4 = 0"
  6386. "  */"
  6387. endvis
  6388. borrar_pantalla
  6389. beginv
  6390. centrar_coordenadas_x 3
  6391. color 14 3
  6392. borde 2
  6393. no_sombra
  6394. cabecera " INICIALIZACIONES DE PUNTEROS "
  6395. "Un puntero que tiene el valor NULL es un"
  6396. "puntero que no apunta a ningún sitio."
  6397. ""
  6398. "Una inicialización muy común en C se ilustra"
  6399. "con el siguiente ejemplo:"
  6400. ""
  6401. "  char *p = "cadena\n";"
  6402. ""
  6403. "En este caso el compilador guarda "cadena\n""
  6404. "en memoria y hace que p apunte al principio"
  6405. "de la cadena, es decir, el carácter 'c'."
  6406. endv
  6407. beginvis
  6408. no_posicion
  6409. coordenadas_completas 3 17 78 23
  6410. color 14 3
  6411. cabecera " EJEMPLOS DE INCIALIZACIONES EQUIVALENTES "
  6412. borde 2
  6413. no_sombra
  6414. ""
  6415. "              ~int x = 10; ~                      ~int x = 10;~"
  6416. "              ~int *p = &x;~         <==>         ~int *p;    ~"
  6417. "                                                ~p = &x;    ~"
  6418. ""
  6419. ""
  6420. "                                                ~int x; ~"
  6421. "              ~int x, *p, y;~        <==>         ~int *p;~"
  6422. "                                                ~int y; ~"
  6423. ""
  6424. ""
  6425. "                                                   ~int *p;    ~"
  6426. "            ~int *p, *q, r = 10;~       <==>         ~int *q;    ~"
  6427. "                                                   ~int r = 10;~"
  6428. ""
  6429. ""
  6430. "                                                 ~int v[2] = { 1, 2 };~"
  6431. "  ~int v[2] = { 1, 2 }, f (void), *p, x = 3;~ <==> ~int f (void);       ~"
  6432. "                                                 ~int *p;             ~"
  6433. "                                                 ~int x = 3;          ~"
  6434. ""
  6435. endvis
  6436. borrar_pantalla
  6437. partir
  6438. beginvis
  6439. no_posicion
  6440. coordenadas_completas 3 3 78 23
  6441. no_sombra
  6442. cabecera " PUNTEROS A FUNCIONES "
  6443. borde 2
  6444. color 14 1
  6445. "Una característica algo confusa pero muy útil de C es el puntero a "
  6446. "función. La confusión surge porque una función tiene una posición"
  6447. "física en memoria que puede asignarse a un puntero aunque la función"
  6448. "no es una variable. La dirección de la función es el punto de entrada"
  6449. "de la función; por tanto, un puntero a función puede utilizarse para"
  6450. "llamar a la función."
  6451. ""
  6452. "Ejemplo:"
  6453. ""
  6454. "~#include <stdio.h> /* printf () */"
  6455. "~"
  6456. "~void main (void)"
  6457. "~{"
  6458. "~  /* escribir es una función que acepta un int como argumento"
  6459. "~     y no devuelve nada */"
  6460. "~  void escribir (int);"
  6461. "~"
  6462. "~  /* pf es un puntero a una función que acepta un int como argumento"
  6463. "~     y no devuelve nada */"
  6464. "~  void (*pf) (int);"
  6465. "~"
  6466. "~  pf = escribir;"
  6467. "~  escribir (1); /* llama a la función escribir */"
  6468. "~  (*pf) (2); /* llama a la función escribir a través de un puntero */"
  6469. "~}"
  6470. "~"
  6471. "~void escribir (int numero)"
  6472. "~{"
  6473. "~  printf ("%d", numero);"
  6474. "~}"
  6475. ""
  6476. "La salida de este programa por pantalla es:"
  6477. "~12~"
  6478. ""
  6479. "Una utilidad de los punteros a funciones la tenemos en las funciones"
  6480. "~qsort()~ y ~bsearch()~ cuyos prototipos están en el fichero stdlib.h."
  6481. endvis
  6482. ; si falta memoria añadir las ventanas de visualización siguientes a la anterior
  6483. beginvis
  6484. no_posicion
  6485. coordenadas_completas 1 2 79 24
  6486. cabecera " qsort () "
  6487. borde 0
  6488. color 15 1
  6489. ""
  6490. "El prototipo de la función qsort() está en el fichero stdlib.h y es:"
  6491. ""
  6492. "  ~void qsort (void *base, unsigned int num, unsigned int tam,~"
  6493. "  ~            int (*compara) (void *arg1, void *arg2));      ~"
  6494. ""
  6495. "La función qsort() ordena el array apuntado por base utilizando el"
  6496. "método de ordenación de C.A.R. Hoare (este método se ha explicado en"
  6497. "el ejemplo 3 de la lección 5). El número de elementos en el array se"
  6498. "especifica mediante num, y el tamaño en bytes de cada elemento está"
  6499. "descrito por tam."
  6500. ""
  6501. "La función compara se utiliza para comparar un elemento del array con"
  6502. "la clave. La comparación debe ser:"
  6503. ""
  6504. "  int nombre_func (void *arg1, void *arg2);"
  6505. ""
  6506. "Debe devolver los siguientes valores:"
  6507. ""
  6508. "  Si arg1 es menor que arg2, devuelve un valor menor que 0."
  6509. "  Si arg1 es igual a arg2 devuelve 0."
  6510. "  Si arg1 es mayor que arg2, devuelve un valor mayor que 0."
  6511. ""
  6512. "El array es ordenado en orden ascendente con la dirección más pequeña"
  6513. "conteniendo el menor elemento."
  6514. ""
  6515. begint
  6516. "En Turbo C, el prototipo de la función qsort() es ligeramente diferente:"
  6517. ""
  6518. "  ~void qsort (void *base, size_t num, size_t tam,          ~"
  6519. "  ~            int (*compara) (const void *, const void *));~"
  6520. ""
  6521. "size_t es un tipo definido en el fichero stdlib.h y suele ser unsigned int;"
  6522. "(const void *) no es lo mismo que (void *), la diferencia entre ellos se va"
  6523. "a estudiar unas tres o cuatro ventanas más adelante, pero podemos intuirla:"
  6524. "en (const void *) el objeto apuntado es constante, es decir, no se puede"
  6525. "modificar, en (void *) el objeto apuntado por el puntero sí se puede modi-"
  6526. "ficar."
  6527. ""
  6528. "Veamos un ejemplo de la utilización de esta función, donde podemos"
  6529. "apreciar además, dos formas posibles de declaración y utilización"
  6530. "de la función de comparación requerida por la función qsort()."
  6531. ""
  6532. "~#include <stdio.h>  /* printf () */"
  6533. "~#include <stdlib.h> /* qsort () */"
  6534. "~"
  6535. "~void main (void)"
  6536. "~{"
  6537. "~  int num[10] = { 3, 2, 8, 9, 2, 2, 1, -2, 3, 2 };"
  6538. "~  register int i;"
  6539. "~  int comparar_creciente (const void *elem1, const void *elem2);"
  6540. "~  int comparar_decreciente (const int *elem1, const int *elem2);"
  6541. "~"
  6542. "~  printf ("\nArray desordenado: ");"
  6543. "~  for (i = 0; i < 10; i++)"
  6544. "~    printf ("%d ", num[i]);"
  6545. "~"
  6546. "~  qsort (num, 10, sizeof (int), comparar_creciente);"
  6547. "~"
  6548. "~  printf ("\nArray ordenado en orden creciente: ");"
  6549. "~  for (i = 0; i < 10; i++)"
  6550. "~    printf ("%d ", num[i]);"
  6551. "~"
  6552. "~  /*"
  6553. "~     el molde del cuarto argumento convierte el tipo"
  6554. "~       (int (*) (const int *, const int *))"
  6555. "~     al tipo"
  6556. "~       (int (*) (const void *, const void *))"
  6557. "~     que es el que requiere la función qsort"
  6558. "~  */"
  6559. "~  qsort (num, 10, sizeof (int),"
  6560. "~         (int (*) (const void *, const void *)) comparar_decreciente);"
  6561. "~"
  6562. "~  printf ("\nArray ordenado en orden decreciente: ");"
  6563. "~  for (i = 0; i < 10; i++)"
  6564. "~    printf ("%d ", num[i]);"
  6565. "~}"
  6566. "~"
  6567. "~int comparar_creciente (const void *elem1, const void *elem2)"
  6568. "~{"
  6569. "~  /* para acceder al contenido de un puntero del tipo (void *)"
  6570. "~     necesitamos moldearlo a un tipo base que no sea void */"
  6571. "~  return (*(int *)elem1 - *(int *)elem2);"
  6572. "~}"
  6573. "~"
  6574. "~int comparar_decreciente (const int *elem1, const int *elem2)"
  6575. "~{"
  6576. "~  return (*elem2 - *elem1);"
  6577. "~}"
  6578. ""
  6579. "La salida de este programa por pantalla es:"
  6580. ""
  6581. "  Array desordenado: 3 2 8 9 2 2 1 -2 3 2"
  6582. "  Array ordenado en orden creciente: -2 1 2 2 2 2 3 3 8 9"
  6583. "  Array ordenado en orden decreciente: 9 8 3 3 2 2 2 2 1 -2"
  6584. ""
  6585. endt
  6586. endvis
  6587. beginvis
  6588. no_posicion
  6589. coordenadas_completas 1 2 79 24
  6590. cabecera " bsearch () "
  6591. borde 0
  6592. color 15 1
  6593. ""
  6594. "El prototipo de la función bsearch() se encuentra en el fichero stdlib.h y"
  6595. "es el siguiente:"
  6596. ""
  6597. "  ~void *bsearch (void *clave, void *base, unsigned int num,    ~"
  6598. "  ~  unsigned int tam, int (*compara) (void *arg1, void *arg2));~"
  6599. ""
  6600. "La función bsearch() realiza una búsqueda binaria en el array ordenado"
  6601. "apuntado por base y devuelve un puntero al primer elemento que se corres-"
  6602. "ponde con la clave apuntada por clave. El número de elementos en el array"
  6603. "está especificado por num y el tamaño (en bytes) de cada elemento está"
  6604. "descrito por tam."
  6605. ""
  6606. "La función apuntada por compara se utiliza para comparar un elemento del"
  6607. "array con la clave. La forma de la función de comparación debe ser:"
  6608. ""
  6609. "  nombre_func (void *arg1, void *arg2);"
  6610. ""
  6611. "Debe devolver los siguientes valores:"
  6612. ""
  6613. "  Si arg1 es menor que arg2, devuelve un valor menor que 0."
  6614. "  Si arg1 es igual que arg2, devuelve 0."
  6615. "  Si arg1 es mayor que arg2, devuelve un valor mayor que 0."
  6616. ""
  6617. "El array debe estar ordenado en orden ascendente con la menor dirección"
  6618. "conteniendo el elemento más pequeño. Si el array no contiene la clave,"
  6619. "se devuelve un puntero nulo."
  6620. ""
  6621. "Esta función está implementada en uno de los ejemplos de la lección 3."
  6622. ""
  6623. begint
  6624. "En Turbo C, el prototipo de la función bsearch() es ligeramente diferente:"
  6625. ""
  6626. "  ~void *bsearch (const void *clave, const void *base, unsigned int *num,   ~"
  6627. "  ~  unsigned int tam, int (*compara) (const void *arg1, const void *arg2));~"
  6628. ""
  6629. "Los tipos size_t y (const void *) se han explicado en la ventana anterior:"
  6630. "qsort()."
  6631. ""
  6632. "Ejemplo:"
  6633. ""
  6634. "~#include <stdlib.h>"
  6635. "~#include <stdio.h>"
  6636. "~"
  6637. "~#define NUM_ELEMENTOS(array) (sizeof(array) / sizeof(array[0]))"
  6638. "~"
  6639. "~int array_de_numeros[] = { 123, 145, 512, 627, 800, 933, 333, 1000 };"
  6640. "~"
  6641. "~int comparacion_de_numeros (const int *p1, const int *p2)"
  6642. "~{"
  6643. "~  return (*p1 - *p2);"
  6644. "~}"
  6645. "~"
  6646. "~int buscar (int clave)"
  6647. "~{"
  6648. "~   int *puntero_a_elemento;"
  6649. "~"
  6650. "~   /* El molde (int (*) (const void *, const void *)) es necesario para"
  6651. "~      evitar un error de tipo distinto en tiempo de compilación. Sin"
  6652. "~      embargo, no es necesario: puntero_a_elemento = (int *) bsearch (..."
  6653. "~      debido a que en este caso es el compilador el que realiza la"
  6654. "~      conversión de tipos */"
  6655. "~   puntero_a_elemento = bsearch (&clave, array_de_numeros,"
  6656. "~     NUM_ELEMENTOS (array_de_numeros), sizeof (int),"
  6657. "~     (int (*) (const void *, const void *)) comparacion_de_numeros);"
  6658. "~"
  6659. "~   return (puntero_a_elemento != NULL);"
  6660. "~}"
  6661. "~"
  6662. "~int main (void)"
  6663. "~{"
  6664. "~  if (buscar (800))"
  6665. "~    printf ("800 está en la tabla.\n");"
  6666. "~  else"
  6667. "~    printf ("800 no está en la tabla.\n");"
  6668. "~"
  6669. "~  return 0;"
  6670. "~}"
  6671. ""
  6672. "La salida de este programa por pantalla es:"
  6673. ""
  6674. "  800 está en la tabla."
  6675. ""
  6676. endt
  6677. endvis
  6678. begint
  6679. beginvis
  6680. no_posicion
  6681. coordenadas_completas 1 2 79 24
  6682. cabecera " lfind () y lsearch () "
  6683. borde 0
  6684. color 15 1
  6685. ""
  6686. "Estas dos funciones no pertenecen al ANSI C actual pero sí están incluidas"
  6687. "en las versiones de Turbo C."
  6688. ""
  6689. "Ambas funciones realizan una búsqueda lineal."
  6690. ""
  6691. "Sus prototipos están en el fichero stdlib.h y son los siguientes:"
  6692. ""
  6693. "~void *lfind (const void *clave, const void *base,                        ~"
  6694. "~             size_t *num, size_t anchura,                                ~"
  6695. "~             int (*func_de_comp) (const void *elem1, const void *elem2));~"
  6696. ""
  6697. "~void *lsearch (const void *clave, void *base, size_t *num, size_t anchura, ~"
  6698. "~               int (*func_de_comp) (const void *elem1, const void *elem2));~"
  6699. ""
  6700. "Estas funciones utilizan una rutina definida por el usuario (func_de_comp)"
  6701. "para la búsqueda de la clave, en un array de elementos secuenciales."
  6702. ""
  6703. "El array tiene num elementos, cada uno de tamaño anchura bytes y comienza"
  6704. "en la dirección de memoria apuntada por base."
  6705. ""
  6706. "Devuelve la dirección de la primera entrada en la tabla que coincida con"
  6707. "la clave buscada. Si la clave buscada no se encuentra, lsearch la añade a"
  6708. "la lista; lfind devuelve 0."
  6709. ""
  6710. "La rutina *func_de_comp debe devolver cero si *elem1 == *elem2, y un valor"
  6711. "distinto de cero en caso contrario."
  6712. ""
  6713. "Ejemplo de la función lfind:"
  6714. ""
  6715. "~#include <stdio.h>"
  6716. "~#include <stdlib.h>"
  6717. "~"
  6718. "~int comparar (int *x, int *y)"
  6719. "~{"
  6720. "~  return (*x - *y);"
  6721. "~}"
  6722. "~"
  6723. "~int main (void)"
  6724. "~{"
  6725. "~  int array[5] = { 5, -1, 100, 99, 10 };"
  6726. "~  size_t nelem = 5;"
  6727. "~  int clave;"
  6728. "~  int *resultado;"
  6729. "~"
  6730. "~  clave = 99;"
  6731. "~  resultado = lfind(&clave, array, &nelem, sizeof (int),"
  6732. "~              (int (*) (const void *, const void *)) comparar);"
  6733. "~  if (resultado)"
  6734. "~    printf ("Número %d encontrado\n", clave);"
  6735. "~  else"
  6736. "~    printf ("Número %d no encontrado.\n", clave);"
  6737. "~"
  6738. "~  return 0;"
  6739. "~}"
  6740. ""
  6741. "La salida de este programa es:"
  6742. ""
  6743. "  Número 99 encontrado."
  6744. ""
  6745. "Ejemplo de la función lsearch:"
  6746. ""
  6747. "~#include <stdlib.h>"
  6748. "~#include <stdio.h>"
  6749. "~"
  6750. "~int numeros[10] = { 3, 5, 1 };"
  6751. "~int nnumeros = 3;"
  6752. "~"
  6753. "~int comparar_numeros (int *num1, int *num2)"
  6754. "~{"
  6755. "~  return (*num1 - *num2);"
  6756. "~}"
  6757. "~"
  6758. "~int aniadir_elemento (int numero_clave)"
  6759. "~{"
  6760. "~  int viejo_nnumeros = nnumeros;"
  6761. "~"
  6762. "~  lsearch ((void *) &numero_clave, numeros,"
  6763. "~           (size_t *) &nnumeros, sizeof (int),"
  6764. "~           (int (*) (const void *, const void *)) comparar_numeros);"
  6765. "~"
  6766. "~  return (nnumeros == viejo_nnumeros);"
  6767. "~}"
  6768. "~"
  6769. "~int main (void)"
  6770. "~{"
  6771. "~  register int i;"
  6772. "~  int clave = 2;"
  6773. "~"
  6774. "~  if (aniadir_elemento (clave))"
  6775. "~    printf ("%d está ya en la tabla de números.\n", clave);"
  6776. "~  else"
  6777. "~    printf ("%d está añadido a la tabla de números.\n", clave);"
  6778. "~"
  6779. "~  printf ("Números en tabla:\n");"
  6780. "~  for (i = 0; i < nnumeros; i++)"
  6781. "~    printf ("%d\n", numeros[i]);"
  6782. "~"
  6783. "~  return 0;"
  6784. "~}"
  6785. ""
  6786. "La salida de este programa es:"
  6787. ""
  6788. "  2 está añadido a la tabla de números."
  6789. "  Números en tabla"
  6790. "  3"
  6791. "  5"
  6792. "  1"
  6793. "  2"
  6794. ""
  6795. endvis
  6796. endt
  6797. beginv
  6798. centrar_coordenadas
  6799. borde 2
  6800. cabecera " TIPO void Y PUNTEROS "
  6801. color 14 4
  6802. no_sombra
  6803. "Hasta esta lección hemos visto que el tipo void tiene dos usos:"
  6804. ""
  6805. "  1.- Para indicar que una función no devuelve nada. Ejemplo:"
  6806. "    ~void hola (char *nombre) { printf ("Hola, %s", nombre); }~"
  6807. ""
  6808. "  2.- Para indicar que una función no acepta ningún argumento."
  6809. "    Ejemplo: ~int numero_1 (void) { return 1; }~"
  6810. ""
  6811. "Aplicados a punteros tiene otro uso: los punteros a void son"
  6812. "punteros genéricos que pueden apuntar a cualquier objeto. Pero"
  6813. "los punteros a void no pueden ser referenciados (utilizando *)"
  6814. "sin utilizar moldes, puesto que el compilador no puede deter-"
  6815. "minar el tamaño del objeto al que apunta el puntero. Ejemplo:"
  6816. "              ~int x; float f;                 ~"
  6817. "              ~void *p = &x; /* p apunta a x */~"
  6818. "              ~int main (void)                 ~"
  6819. "              ~  {                             ~"
  6820. "              ~    *(int *) p = 2;             ~"
  6821. "              ~    p = &r;  /* p apunta a f */ ~"
  6822. "              ~    *(float *) p = 1.1;         ~"
  6823. "              ~  }                             ~"
  6824. endv
  6825. beginvis
  6826. no_posicion
  6827. no_multiatributo
  6828. cabecera " MODIFICADOR DE ACCESO const Y PUNTEROS "
  6829. color 1 3
  6830. coordenadas_completas 3 3 78 23
  6831. borde 2
  6832. no_sombra
  6833. "El modificador de acceso const aplicado a punteros ofrece varias"
  6834. "posibilidades. Veámosla en los siguientes ejemplos:"
  6835. ""
  6836. "  void main (void)"
  6837. "  {"
  6838. "    char *p1 = "abc";             /* puntero */"
  6839. "    const char *p2 = "abc";       /* puntero a constante */"
  6840. "    char *const p3 = "abc";       /* puntero constante */"
  6841. "    const char *const p4 = "abc"; /* puntero constante a constante */"
  6842. ""
  6843. "    *p1 = 'd'; /* correcto */"
  6844. "    *p2 = 'd'; /* error */"
  6845. "    *p3 = 'd'; /* correcto */"
  6846. "    *p4 = 'd'; /* error */"
  6847. ""
  6848. "    p1++; /* correcto */"
  6849. "    p2++; /* correcto */"
  6850. "    p3++; /* error */"
  6851. "    p4++; /* error */"
  6852. ""
  6853. "    p1 = p2; /* warning */"
  6854. "    p1 = p3; /* correcto */ "
  6855. "    p1 = p4; /* warning */"
  6856. ""
  6857. "    p2 = p1; /* correcto */"
  6858. "    p2 = p3; /* correcto */"
  6859. "    p2 = p4; /* correcto */"
  6860. ""
  6861. "    p3 = p1; /* error */"
  6862. "    p3 = p2; /* error */"
  6863. "    p3 = p4; /* error */"
  6864. ""
  6865. "    p4 = p1; /* error */"
  6866. "    p4 = p2; /* error */"
  6867. "    p4 = p3; /* error */"
  6868. "  }"
  6869. ""
  6870. "Las líneas que contienen el mensaje de error provocan un error de"
  6871. "compilación. Las líneas que contienen el mensaje de warning provoca"
  6872. "en algunos compiladores un mensaje de conversión de puntero sospechosa"
  6873. "que se puede solucionar haciendo la conversión de una forma explícita:"
  6874. ""
  6875. "  p1 = (char *) p2;"
  6876. "  p1 = (char *) p4;"
  6877. ""
  6878. "Si ahora hacemos:"
  6879. ""
  6880. "  *p1 = 'd';"
  6881. ""
  6882. "estamos modificando los valores apuntados por p2 y p4; es decir,"
  6883. "los valores apuntados por p2 y p4 no pueden ser modificados por"
  6884. "estos punteros pero sí pueden ser modificados indirectamente por"
  6885. "otro puntero."
  6886. ""
  6887. "Otro ejemplo de cómo se puede modificar el valor de una constante"
  6888. "indirectamente a través de un puntero:"
  6889. ""
  6890. "  const int x = 10; /* x es una variable constante */"
  6891. "  x = 20; /* esto provoca un error en compilación */"
  6892. "  *(int *)&x = 20; /* esto es correcto: obtenemos su dirección, que"
  6893. "                    es del tipo (const int *) y la moldeamos al tipo"
  6894. "                    (int *), una vez hecho esto accedemos al valor de"
  6895. "                    esa dirección con el operador de contenido * */"
  6896. endvis
  6897. borrar_pantalla
  6898. beginvis
  6899. no_posicion
  6900. no_multiatributo
  6901. cabecera " DECLARACIONES CURIOSAS "
  6902. color 7 0
  6903. coordenadas_completas 3 3 78 23
  6904. borde 2
  6905. no_sombra
  6906. ""
  6907. "El C permite la creación de formas de datos muy elaboradas."
  6908. ""
  6909. "Cuando se hace una declaración, el nombre (o "identificador") que"
  6910. "usamos se puede modificar añadiéndole uno o varios modificadores:"
  6911. ""
  6912. "            Modificador            Significado"
  6913. "            -----------        --------------------"
  6914. "                 *              indica un puntero"
  6915. "                ( )             indica una función"
  6916. "                [ ]             indica un array"
  6917. ""
  6918. "La clave para desentrañar las declaraciones que mostraremos a con-"
  6919. "tinuación es averiguar el orden en que se aplican los modificadores."
  6920. "Para ello se siguen tres reglas:"
  6921. ""
  6922. "  1. La prioridad de un modificador es tanto mayor cuanto más próximo"
  6923. "     esté el identificador."
  6924. ""
  6925. "  2. Los modificadores [] y () tienen mayor prioridad que *."
  6926. ""
  6927. "  3. Se pueden usar paréntesis para agrupar parte de la expresión"
  6928. "     otorgándole la máxima prioridad."
  6929. ""
  6930. "Ejemplos:"
  6931. ""
  6932. "  void main (void)"
  6933. "  {"
  6934. "    /* array de arrays de int */"
  6935. "    int x1[8][8];"
  6936. ""
  6937. "    /* puntero a puntero a int */"
  6938. "    int **x2;"
  6939. ""
  6940. "    /* array de 10 punteros a int */"
  6941. "    int *x3[10];"
  6942. ""
  6943. "    /* puntero a array de 10 int */"
  6944. "    int (*x4)[10];"
  6945. ""
  6946. "    /* array de 3 punteros a array de 4 int */"
  6947. "    int *x5[3][4];"
  6948. ""
  6949. "    /* puntero a array de 3x4 int */"
  6950. "    int (*x6)[3][4];"
  6951. ""
  6952. "    /* función que devuelve un puntero a int */"
  6953. "    int *x7(void);"
  6954. ""
  6955. "    /* puntero a función que devuelve un tipo int */"
  6956. "    int (*x8)(void);"
  6957. ""
  6958. "    /* función que acepta un puntero a char como argumento y que"
  6959. "       devuelve un puntero a un puntero a una función que devuelve"
  6960. "       un carácter */"
  6961. "    char (*(*x11(char*)))(void);"
  6962. ""
  6963. "    /* puntero a función que devuelve un puntero a puntero a carácter"
  6964. "       y acepta dos argumentos: el primero es un puntero a puntero a"
  6965. "       puntero a carácter, y el segundo es un array de 10 punteros a"
  6966. "       carácter */"
  6967. "    char ** (*x12) (char ***, char *[10]);"
  6968. ""
  6969. "    /* función que acepta un puntero a puntero a puntero a constante y"
  6970. "       devuelve una puntero constante a constante */"
  6971. "    const void * const x13 (const void ***);"
  6972. ""
  6973. "    /* función que no devuelve nada y acepta como argumento un puntero"
  6974. "       a función que no devuelve nada y acepta como argumento un puntero"
  6975. "       a función que no devuelve nada y no acepta ningún argumento */"
  6976. "    void x14 (void (*) (void (*) (void)));"
  6977. ""
  6978. "    /* función que acepta un int como argumento y devuelve un puntero"
  6979. "       a una función que acepta un int como argumento y que devuelve"
  6980. "       un int */"
  6981. "    int (* (x15 (int))) (int);"
  6982. "  }"
  6983. ""
  6984. endvis
  6985. begint
  6986. beginvis
  6987. coordenadas_completas 1 2 80 24
  6988. color 7 1
  6989. no_posicion
  6990. no_multiatributo
  6991. cabecera " MODIFICADORES DE TIPO near, far, huge Y MODELOS DE MEMORIA EN TURBO C "
  6992. borde 2
  6993. "En MS-DOS se suele direccionar memoria en la forma:"
  6994. ""
  6995. "  segmento:offset"
  6996. ""
  6997. "donde cada segmento son 64K y offset es el desplazamiento dentro de cada"
  6998. "segmento."
  6999. ""
  7000. "Los modificadores de tipo near, far y huge, que sólo se pueden aplicar a"
  7001. "punteros y funciones, están relacionados con el direccionamiento de memoria."
  7002. ""
  7003. "El modificador near (cerca) fuerza que el valor de un puntero o una función"
  7004. "estén en un sólo segmento mientras que far (lejos) y huge (enorme) hacen que"
  7005. "un puntero pueda apuntar a cualquier dirección de la memoria y una función"
  7006. "puede estar en culquier lugar de la memoria disponible."
  7007. ""
  7008. "A continuación exponemos la descripción de los modificadores near, far y"
  7009. "huge así como los distintos modelos de compilación en Turbo C:"
  7010. ""
  7011. ""
  7012. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  7013. "  near (modificador de tipo)"
  7014. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  7015. "Fuerza a los punteros a ser near (estar cerca, un mismo segmento), genera"
  7016. "código de funciones para llamadas near y devuelve un valor near."
  7017. ""
  7018. "  <tipo> near <definicion-puntero> ;"
  7019. "         o"
  7020. "  <tipo> near <definicion-funcion>"
  7021. ""
  7022. "La primera versión de near declara un puntero de tamaño una palabra (2 bytes)"
  7023. "con un rango de 64K. Este modificador de tipo es usado normalmente cuando se"
  7024. "compila en los modelos de memoria medium, large y huge para forzar a que los"
  7025. "punteros sean near (ya que por defecto, son far, en los modelos de memoria"
  7026. "mencionados)."
  7027. ""
  7028. " Ejemplo"
  7029. " ▀▀▀▀▀▀▀"
  7030. "  char near *s;"
  7031. "  int (near *pi)[10];"
  7032. ""
  7033. "Cuando near es usado con una declaración de función, Turbo C genera código"
  7034. "de función para una llamada near y devuelve near."
  7035. ""
  7036. " Ejemplo"
  7037. " ▀▀▀▀▀▀▀"
  7038. "  int near mi_funcion () {}"
  7039. ""
  7040. ""
  7041. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  7042. "  far (modificador de tipo)"
  7043. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  7044. "Fuerza a los punteros a ser far (estar lejos, cualquier segmento), genera"
  7045. "código de funciones para llamadas far y devuelve un valor far."
  7046. ""
  7047. "  <tipo> far <definicion-puntero> ;"
  7048. "         o"
  7049. "  <tipo> far <definicion-funcion>"
  7050. ""
  7051. "La primera versión de far declara un puntero de tamaño dos palabras (4 bytes)"
  7052. "con un rango de 1 megabyte. Este modificador de tipo es usado normalmente"
  7053. "cuando se compila en los modelos de memoria tiny, small y compact para forzar"
  7054. "a que los punteros sean far (ya que por defecto, son near, en los modelos de"
  7055. "memoria mencionados)."
  7056. ""
  7057. " Ejemplo"
  7058. " ▀▀▀▀▀▀▀"
  7059. "  char far *s;"
  7060. "  void * far * p;"
  7061. ""
  7062. "Cuando far es usado con una declaración de función, Turbo C genera código"
  7063. "de función para una llamada far y devuelve far."
  7064. ""
  7065. " Ejemplo"
  7066. " ▀▀▀▀▀▀▀"
  7067. "  int far my_func() {}"
  7068. ""
  7069. ""
  7070. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  7071. "  huge (modificador de tipo)"
  7072. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  7073. "Es similar al modificador de tipo far"
  7074. ""
  7075. "  <tipo> huge <definicion-puntero> ;"
  7076. ""
  7077. "El modificador huge es similar al modificador far pero tiene dos carac-"
  7078. "terísticas adicionales:"
  7079. ""
  7080. " ■ Su segmento es normalizado durante la aritmética de punteros así que"
  7081. "   las comparaciones de punteros son más precisas."
  7082. ""
  7083. " ■ Los punteros huge pueden ser incrementados sin el temor de que sobrepase"
  7084. "   un segmento."
  7085. ""
  7086. "En resumen, la utilización de punteros huge es más segura que la utilización"
  7087. "de punteros far, pero su uso es más lento porque requieren más comprobacio-"
  7088. "nes."
  7089. ""
  7090. ""
  7091. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  7092. "  Opciones de modelo"
  7093. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  7094. "Las opciones de modelo especifican qué modelo de memoria se quiere usar. El"
  7095. "modelo de memoria elegido determina el método de direccionamiento de memoria"
  7096. "por defecto."
  7097. ""
  7098. "El modelo por defecto es small."
  7099. ""
  7100. " ┌────────╥───────────────────╥─────────────┐"
  7101. " │        ║     Segmentos     ║   Punteros  │"
  7102. " │ Modelo ║Código│Datos│ Pila ║Código│Datos │"
  7103. " ╞════════╬══════╧═════╧══════╬══════╪══════╡"
  7104. " │ Tiny   ║       64 K        ║ near │ near │"
  7105. " ├────────╫──────┬────────────╫──────┼──────┤"
  7106. " │ Small  ║ 64 K │    64 K    ║ near │ near │"
  7107. " ├────────╫──────┼────────────╫──────┼──────┤"
  7108. " │ Medium ║ 1 MB │    64 K    ║ far  │ near │"
  7109. " ├────────╫──────┼────────────╫──────┼──────┤"
  7110. " │ Compact║ 64 K │    1 MB    ║ near │ far  │"
  7111. " ├────────╫──────┼────────────╫──────┼──────┤"
  7112. " │ Large  ║ 1 MB │    1 MB    ║ far  │ far  │"
  7113. " ├────────╫──────┼─────┬──────╫──────┼──────┤"
  7114. " │ Huge   ║ 1 MB │ 64 K│ 64 K ║ far  │ far  │"
  7115. " │        ║      │ cada│ pila ║      │      │"
  7116. " │        ║      │ uno │      ║      │      │"
  7117. " └────────╨──────┴─────┴──────╨──────┴──────┘"
  7118. ""
  7119. ""
  7120. " ┌──────────┐"
  7121. " │   Tiny   │"
  7122. " └──────────┘"
  7123. ""
  7124. "Usa el modelo tiny (muy pequeño) cuando la cantidad de memoria a consumir"
  7125. "es muy importante y ha de ser la menor posible."
  7126. ""
  7127. "Los cuatro registros de segmentos (CS, DS, ES, SS) toman la misma dirección,"
  7128. "de este modo tenemos un total de 64K para código, datos y pila. Siempre se"
  7129. "usan punteros near."
  7130. ""
  7131. "Los programas de modelo tiny pueden ser convertidos a formato .COM."
  7132. ""
  7133. ""
  7134. " ┌───────────┐"
  7135. " │   Small   │"
  7136. " └───────────┘"
  7137. ""
  7138. "Usa el modelo small (pequeño) para aplicaciones de tamaño medio."
  7139. ""
  7140. "Los segmentos de código y datos son diferentes, así que tenemos 64K de"
  7141. "código y 64K de datos y pila."
  7142. ""
  7143. "Siempre son usados los punteros near."
  7144. ""
  7145. ""
  7146. " ┌──────────┐"
  7147. " │  Medium  │"
  7148. " └──────────┘"
  7149. ""
  7150. "El modelo medium (medio) es mejor para grandes programas que no guardan"
  7151. "muchos datos en memoria."
  7152. ""
  7153. "Los punteros far son usados para código pero no para datos. Esto da como"
  7154. "resultado que los datos y la pila juntos están limitados a 64K, pero el"
  7155. "código puede ocupar hasta 1MB."
  7156. ""
  7157. ""
  7158. " ┌─────────┐"
  7159. " │ Compact │"
  7160. " └─────────┘"
  7161. ""
  7162. "Usa el modelo compact (compacto) si tu código es pequeño pero necesitas"
  7163. "direccionar una gran cantidad de datos."
  7164. ""
  7165. "El modelo compact es el contrario al modelo medium: los punteros far son"
  7166. "usados para los datos pero no para el código; el código está limitado"
  7167. "entonces a 64K, mientras que los datos tienen un rango de 1Mb."
  7168. ""
  7169. "Todas las funciones son near por defecto y todos los punteros de datos son"
  7170. "far por defecto."
  7171. ""
  7172. ""
  7173. " ┌───────────┐"
  7174. " │   Large   │"
  7175. " └───────────┘"
  7176. ""
  7177. "Usa el modelo large (grande) para aplicaciones muy grandes solamente."
  7178. ""
  7179. "Los punteros far son usados para código y datos, dando un rango de 1Mb"
  7180. "para ambos. Todas las funciones y punteros de datos son far por defecto."
  7181. ""
  7182. ""
  7183. " ┌────────────┐"
  7184. " │    Huge    │"
  7185. " └────────────┘"
  7186. ""
  7187. "Usa el modelo huge (muy grande) para aplicaciones muy grandes solamente. Los"
  7188. "punteros far son usados para el código y los datos."
  7189. ""
  7190. "Turbo C limita normalmente el tamaño de los datos a 64K; el modelo de memoria"
  7191. "huge aparta ese límite permitiendo a los datos ocupar más de 64K."
  7192. ""
  7193. "El modelo huge permite múltiples segmentos de datos (cada uno de 64K de"
  7194. "tamaño), hasta 1MB para el código, y 64K para la pila."
  7195. ""
  7196. "Todas las funciones y punteros de datos se asumen como far."
  7197. endvis
  7198. endt
  7199. end lección 7
  7200.  
  7201. ; LECCION 8
  7202. begin
  7203. beginv
  7204. borde 2
  7205. color 1 7
  7206. centrar_coordenadas
  7207. cabecera " INTRODUCCION A LA LECCION 8 "
  7208. ""
  7209. "~  El objetivo de esta lección es hacer un estudio  ~"
  7210. "~  completo en todo lo referente a la declaración,  ~"
  7211. "~  utilización e inicialización de tipos compuestos ~"
  7212. "~  de datos y explicar cómo se pueden crear nuevos  ~"
  7213. "~  tipos de datos a partir de los ya existentes.    ~"
  7214. ""
  7215. "El lenguaje C proporciona cinco maneras diferentes"
  7216. "de crear tipos de datos:"
  7217. ""
  7218. "  - Estructuras (~struct~)."
  7219. "  - Campos de bits."
  7220. "  - Uniones (~union~)."
  7221. "  - Enumeraciones (~enum~)."
  7222. "  - Tipos definidos por el usuario (~typedef~)."
  7223. ""
  7224. "Al terminar la lección se presenta una tabla de"
  7225. "precedencia de todos los operadores del lenguaje C."
  7226. ""
  7227. endv
  7228. borrar_pantalla
  7229. beginv
  7230. cabecera " ESTRUCTURAS "
  7231. color 15 1
  7232. centrar_coordenadas_x 2
  7233. "En el lenguaje C una estructura es un conjunto de variables"
  7234. "que se referencia bajo un mismo nombre, proporcionando un"
  7235. "medio conveniente de mantener junta información relacionada."
  7236. ""
  7237. "Las estructuras se denominan registros en otros lenguajes;"
  7238. "por ejemplo, en Pascal."
  7239. ""
  7240. "A los elementos de la estructura se les suele llamar miembros"
  7241. "o campos."
  7242. endv
  7243. beginv
  7244. cabecera " DECLARACION DE ESTRUCTURAS "
  7245. coordenadas_completas 1 3 35 16
  7246. color 15 2
  7247. no_sombra
  7248. "Una estructura se declara con"
  7249. "la palabra ~struct~ seguida de"
  7250. "una lista de declaraciones en-"
  7251. "cerradas entre llaves. Ejemplo:"
  7252. ""
  7253. "  ~struct      ~"
  7254. "  ~ {          ~"
  7255. "  ~   int dia; ~"
  7256. "  ~   int mes; ~"
  7257. "  ~   int anio;~"
  7258. "  ~ };         ~"
  7259. endv
  7260. beginv
  7261. coordenadas_completas 36 3 80 16
  7262. "Después de la palabra clave struct va op-"
  7263. "cionalmente el nombre de la estructura y"
  7264. "se puede emplear en declaraciones poste-"
  7265. "riores como una abreviatura de la entrada."
  7266. "  ~struct fecha ~"
  7267. "  ~  {          ~"
  7268. "  ~    int dia; ~"
  7269. "  ~    int mes; ~"
  7270. "  ~    int anio;~"
  7271. "  ~  };         ~"
  7272. endv
  7273. beginv
  7274. centrar_coordenadas_x 17
  7275. no_sombra
  7276. "En los ejemplos anteriores no se han declarado realmente variables,"
  7277. "sino que sólo se han definido la forma de los datos."
  7278. endv
  7279. beginv
  7280. coordenadas_completas 1 17 40 24
  7281. no_sombra
  7282. "Para declarar una variable de un"
  7283. "tipo estructura sin nombre se hace:"
  7284. "  ~struct                 ~"
  7285. "  ~  {                    ~"
  7286. "  ~    int dia, mes, anio;~"
  7287. "  ~  } fecha_creacion;    ~"
  7288. endv
  7289. beginv
  7290. coordenadas_completas 41 17 80 24
  7291. "Si la estructura tiene nombre se"
  7292. "puede hacer de la siguiente forma:"
  7293. ""
  7294. "~struct fecha { int dia, mes, anio; };~"
  7295. "~struct fecha fecha_creacion;~"
  7296. endv
  7297. beginv
  7298. coordenadas_completas 1 4 42 18
  7299. color 15 6
  7300. no_sombra
  7301. "De la misma forma se pueden declarar"
  7302. "varias variables separadas por comas:"
  7303. ""
  7304. "  ~struct                     ~"
  7305. "  ~  {                        ~"
  7306. "  ~    int dia, mes, anio;    ~"
  7307. "  ~  } fecha1, fecha2, fecha3;~"
  7308. ""
  7309. "o bien:"
  7310. ""
  7311. "~struct fecha { int dia, mes, anio; };~"
  7312. "~struct fecha fecha1, fecha2, fecha3; ~"
  7313. endv
  7314. beginv
  7315. coordenadas_completas 43 4 80 18
  7316. "También se puede crear un tipo"
  7317. "estructura y una variable de tipo"
  7318. "estructura al mismo tiempo:"
  7319. ""
  7320. "  ~struct                     ~"
  7321. "  ~  {                        ~"
  7322. "  ~    int dia, mes, anio;    ~"
  7323. "  ~  } fecha1, fecha2, fecha3;~"
  7324. endv
  7325. beginv
  7326. centrar_coordenadas_x 5
  7327. color 15 4
  7328. "La forma general de definición de un estructura es:"
  7329. ""
  7330. "  ~struct nombre_tipo_estructura    ~"
  7331. "  ~  {                              ~"
  7332. "  ~    tipo_1 nombre_variable_1;    ~"
  7333. "  ~    tipo_2 nombre_variable_2;    ~"
  7334. "  ~    ...                          ~"
  7335. "  ~    tipo_n nombre_variable_n;    ~"
  7336. "  ~  } nombres_variables_estructura;~"
  7337. ""
  7338. "donde tanto los nombres nombre_tipo_estructura como"
  7339. "nombres_variables_estructura pueden omitirse."
  7340. endv
  7341. beginv
  7342. centrar_coordenadas_x 6
  7343. color 15 3
  7344. cabecera " INICIALIZACION DE ESTRUCTURAS "
  7345. "Una estructura se inicializa añadiendo a su"
  7346. "definición la lista de inicializaciones de"
  7347. "las componentes."
  7348. ""
  7349. "~struct fecha fecha_creacion = { 22, 7, 90 };~"
  7350. endv
  7351. beginv
  7352. centrar_coordenadas_x 7
  7353. color 15 5
  7354. cabecera " TAMAÑO DE UNA ESTRUCTURA "
  7355. "El tamaño en bytes de un tipo estructura en memoria es la suma de"
  7356. "los tamaños en bytes de cada uno de los tipos de sus componentes:"
  7357. ""
  7358. "~sizeof (struct fecha) == sizeof (int) + sizeof (int) + sizef (int)~"
  7359. endv
  7360. beginv
  7361. centrar_coordenadas_x 8
  7362. color 15 7
  7363. cabecera " REFERENCIA A LOS ELEMENTOS DE LA ESTRUCTURA "
  7364. "Los elementos individuales de la estructura se referencia utilizando"
  7365. "el operador punto (.). La forma general es:"
  7366. ""
  7367. "  ~fecha_creacion.dia = 3;                                    ~"
  7368. "  ~printf ("%d", fecha_creacion.dia); /* muestra el valor 3 */~"
  7369. endv
  7370. beginv
  7371. centrar_coordenadas
  7372. color 14 7
  7373. "Un elemento de una estructura, el nombre de una estructura"
  7374. "y una variable ordinaria pueden tener el mismo nombre;"
  7375. "siempre se pueden distinguir a través del contexto. Por"
  7376. "supuesto que estas cosas se deben evitar en lo posible si"
  7377. "disminuyen la legibilidad del código. Por ejemplo:"
  7378. ""
  7379. "  ~struct x { int x; } x;~"
  7380. endv
  7381. beginvis
  7382. coordenadas_completas 3 3 77 23
  7383. color 14 1
  7384. borde 2
  7385. no_posicion
  7386. cabecera " ALGUNOS TIPOS USUALES QUE SE PUEDEN HACER CON LAS ESTRUCTURAS "
  7387. ""
  7388. "▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  7389. "ARRAYS DE ESTRUCTURAS"
  7390. "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  7391. ""
  7392. "Declaración:"
  7393. ""
  7394. "  ~struct x        ~                               ~struct x            ~"
  7395. "  ~  {             ~                               ~  {                 ~"
  7396. "  ~    char *s;    ~                               ~     char *s;       ~"
  7397. "  ~    int d;      ~                               ~     int d;         ~"
  7398. "  ~  } y[] =       ~            o también          ~  } y[] =           ~"
  7399. "  ~      {         ~                               ~      {             ~"
  7400. "  ~        "s1", 4,~                               ~        { "s1", 4 },~"
  7401. "  ~        "s2", 3,~                               ~        { "s2", 3 },~"
  7402. "  ~        "s3", 10~                               ~        { "s3", 10 }~"
  7403. "  ~      };        ~                               ~       };           ~"
  7404. ""
  7405. "Utilización:"
  7406. ""
  7407. "   ~printf ("%s %d", y[1].s, y1[1].d); /* imprime s2 3 */~"
  7408. ""
  7409. ""
  7410. "▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  7411. "ARRAYS DENTRO DE ESTRUCTURAS"
  7412. "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  7413. ""
  7414. "Declaración:"
  7415. ""
  7416. "  ~struct x      ~"
  7417. "  ~  {           ~"
  7418. "  ~    int a[10];~"
  7419. "  ~    float b;  ~"
  7420. "  ~  } y;        ~"
  7421. ""
  7422. "Utilización:"
  7423. ""
  7424. "  ~y.a[1] = 2;~"
  7425. ""
  7426. ""
  7427. "▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  7428. "ESTRUCTURAS DENTRO DE ESTRUCTURAS (ESTRUTURAS ANIDADAS)"
  7429. "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  7430. ""
  7431. "Declaración:"
  7432. ""
  7433. "  ~struct persona                                      ~"
  7434. "  ~  {                                                 ~"
  7435. "  ~    char nombre[TAMNOMBRE], direccion[TAMDIRECCION];~"
  7436. "  ~    struct fecha fecha_nacimiento;                  ~"
  7437. "  ~  } empleado;                                       ~"
  7438. ""
  7439. "Utilización:"
  7440. ""
  7441. "  ~empleado.fecha_nacimiento.dia = 10;~"
  7442. ""
  7443. ""
  7444. "▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  7445. "PUNTEROS A ESTRUCTURAS"
  7446. "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  7447. ""
  7448. "Declaración:"
  7449. ""
  7450. "  ~struct fecha fecha_creacion, *pfecha;~"
  7451. "  ~pfecha = &fecha_creacion;            ~"
  7452. ""
  7453. "Utilización:"
  7454. ""
  7455. "  Hay dos formas equivalentes de acceder a los elementos de una"
  7456. "  estructura mediante un puntero a la estructura:"
  7457. ""
  7458. "    1) ~(*pfecha).dia = 20;~"
  7459. ""
  7460. "      Los paréntesis son necesarios porque el operador . tiene"
  7461. "      más prioridad que el operador *."
  7462. ""
  7463. "    2) ~pfecha->dia = 20;~"
  7464. ""
  7465. "      El operador -> se utiliza para acceder a un elemento de una"
  7466. "      estructura a través de un puntero."
  7467. ""
  7468. "      Esta forma es mucho más común que la anterior, es más, el"
  7469. "      primer método se considera arcaico en los estándares actuales."
  7470. ""
  7471. "      Debido a que este tipo de operación es tan común, C propor-"
  7472. "      ciona un operador específico para realizar esta tarea: el"
  7473. "      operador flecha (->)."
  7474. ""
  7475. ""
  7476. endvis
  7477. beginvis
  7478. coordenadas_completas 1 3 80 24
  7479. color 15 1
  7480. borde 2
  7481. cabecera " ESTRUCTURAS Y FUNCIONES "
  7482. "Con respecto a las estructuras, a una función le podemos pasar como"
  7483. "argumento:"
  7484. ""
  7485. "  - Un elemento de una estructura."
  7486. "  - Una estructura completa."
  7487. "  - La dirección de una estructura."
  7488. ""
  7489. ""
  7490. "PASO DE ELEMENTOS A ESTRUCTURAS A FUNCIONES"
  7491. "-------------------------------------------"
  7492. ""
  7493. "Cuando se pasa un elemento de una variable de estructura a una función,"
  7494. "se está realmente pasando el valor de ese elemento a la función. Además,"
  7495. "si ese elemento es de tipo simple, se está pasando una variable simple."
  7496. ""
  7497. "Ejemplo:"
  7498. ""
  7499. "~struct x"
  7500. "~  {"
  7501. "~    int i;"
  7502. "~    char c;"
  7503. "~    char s[10];"
  7504. "~  } y = { 2, 'd', "string" };"
  7505. "~"
  7506. "~/* pasando argumentos por valor: */"
  7507. "~"
  7508. "~func1 (y.i);    /* se pasa variable entera (2) */"
  7509. "~func2 (y.c);    /* se pasa variable carácter ('d') */"
  7510. "~func3 (y.s);    /* se pasa variable string (dirección de la cadena s) */"
  7511. "~func4 (y.s[1]); /* se pasa variable carácter ('t') */"
  7512. "~"
  7513. "~/* pasando argumentos por referencia: */"
  7514. "~"
  7515. "~func5 (&y.i);   /* se pasa la dirección de la variable entera y.i */"
  7516. "~func6 (&y.c);   /* se pasa la dirección de la variable carácter y.c */"
  7517. "~func7 (y.s);    /* se pasa la dirección del string y.s */"
  7518. "~func8 (&y.s[1]);/* se pasa la dirección de la variable carácter y.s[1] */"
  7519. ""
  7520. "Observar que el operador & precede al nombre de la estructura y no al"
  7521. "nombre del elemento individual."
  7522. ""
  7523. ""
  7524. "PASO DE ESTRUCTURAS A FUNCIONES"
  7525. "-------------------------------"
  7526. ""
  7527. "Cuando se utiliza una estructura como argumento de una función, se pasa"
  7528. "la estructura íntegra mediante el uso del método estándar de llamada por"
  7529. "valor. Esto significa, por supuesto, que todos los cambios realizados en"
  7530. "los contenidos de la estructura, dentro de la función a la que se pasa,"
  7531. "no afectan a la estructura utilizada como argumento."
  7532. ""
  7533. "Ejemplo 1: Estructura sin nombre."
  7534. ""
  7535. "~#include <stdio.h>"
  7536. "~"
  7537. "~void f (); /* los paréntesis vacíos quieren decir que no decimos"
  7538. "~              nada acerca de sus parámetros */"
  7539. "~"
  7540. "~void main (void)"
  7541. "~{"
  7542. "~  struct { int a, b; } arg;"
  7543. "~  arg.a = 10;"
  7544. "~  f (arg); /* imprime 10 */"
  7545. "~}"
  7546. "~"
  7547. "~void f (param)"
  7548. "~struct { int x, y; } param;"
  7549. "~{"
  7550. "~  printf ("%d", param.x);"
  7551. "~}"
  7552. ""
  7553. "Ejemplo 2: Estructura con nombre."
  7554. ""
  7555. "~#include <stdio.h>"
  7556. "~"
  7557. "~struct st { int a, b; }; /* si se declarase dentro de la función main, esta"
  7558. "~                            estructura sólo se conocería en esa función */"
  7559. "~"
  7560. "~void f (); /* los paréntesis vacíos quieren decir que no decimos"
  7561. "~              nada acerca de sus parámetros */"
  7562. "~"
  7563. "~void main (void)"
  7564. "~{"
  7565. "~  struct st arg;"
  7566. "~  arg.a = 10;"
  7567. "~  f (arg); /* imprime 10 */"
  7568. "~}"
  7569. "~"
  7570. "~void f (param)"
  7571. "~struct st param;"
  7572. "~{"
  7573. "~  printf ("%d", param.a);"
  7574. "~}"
  7575. ""
  7576. ""
  7577. "PASO DE DIRECCIONES DE ESTRUCTURAS A FUNCIONES"
  7578. "----------------------------------------------"
  7579. ""
  7580. "En la práctica nunca se pasan las estructuras completas a funciones porque"
  7581. "ese procedimiento es tremendamente ineficiente (en cuanto a tiempo y memoria"
  7582. "consumida). Lo que se hace en lugar de ello es pasar la dirección de la"
  7583. "variable estructura como argumento y declarar el parámetro de la función"
  7584. "como un puntero a esta estructura."
  7585. ""
  7586. "Ejemplo: Paso de dirección de variable estructura."
  7587. ""
  7588. "~#include <stdio.h>"
  7589. "~"
  7590. "~struct st { int a, b; }; /* si se declarase dentro de la función main, esta"
  7591. "~                            estructura sólo se conocería en esa función */"
  7592. "~"
  7593. "~void f (); /* los paréntesis vacíos quieren decir que no decimos"
  7594. "~              nada acerca de sus parámetros */"
  7595. "~"
  7596. "~void main (void)"
  7597. "~{"
  7598. "~  struct st arg;"
  7599. "~  arg.a = 10;"
  7600. "~  f (&arg);  /* imprime 10 */"
  7601. "~}"
  7602. "~"
  7603. "~void f (param)"
  7604. "~struct st *param;"
  7605. "~{"
  7606. "~  printf ("%d", param->a);"
  7607. "~}"
  7608. ""
  7609. "Si consideramos que sizeof(struct st *)==2 y sizeof(int)==2, entonces"
  7610. "sizeof(struct st)==4. Por lo tanto, al pasar la estructura íntegra pasamos"
  7611. "4 bytes a la función y al pasar el puntero a la estructura sólo pasamos 2"
  7612. "bytes a la función. En el ejemplo visto la diferencia no parece muy signi-"
  7613. "ficativa, pero si sizeof(struct st)==1000, al pasar la estructura íntegra"
  7614. "pasamos 1000 bytes mientras que con su dirección pasamos 2 bytes."
  7615. ""
  7616. begint
  7617. "Para los usuarios que tengan la opción turbo on, recordarán que los punteros"
  7618. "near ocupan 2 bytes (sólo contienen el desplazamiento dentro del segmento de"
  7619. "memoria) y los punteros far 4 bytes (contienen segmento y desplazamiento"
  7620. "dentro del segmento). Al suponer en el párrafo anterior que sizeof(struct"
  7621. "st *)==2, estamos suponiendo que el puntero es near."
  7622. endt
  7623. endvis
  7624. borrar_pantalla
  7625. beginv
  7626. cabecera " CAMPO DE BITS "
  7627. color 14 5
  7628. coordenadas 1 2
  7629. "A difererencia de la mayoría de los lenguajes"
  7630. "de computadoras, el lenguaje C tiene un método"
  7631. "incorporado para acceder a un bit individual"
  7632. "dentro de un byte. Esto se puede hacer con"
  7633. "los operadores de bits que vimos en la lección"
  7634. "2 pero también se puede hacer con un tipo es-"
  7635. "pecia de estructura llamada campo de bits."
  7636. endv
  7637. beginv
  7638. cabecera " DECLARACION "
  7639. coordenadas 3 3
  7640. color 14 7
  7641. "La forma general de definición"
  7642. "de un campo de bits es:"
  7643. ""
  7644. "~struct nombre_estructura      ~"
  7645. "~  {                           ~"
  7646. "~    tipo1 nombre1 : longitud1;~"
  7647. "~    tipo2 nombre2 : longitud2;~"
  7648. "~    ...                       ~"
  7649. "~  };                          ~"
  7650. ""
  7651. "Un campo de bits tiene que de-"
  7652. "clararse como int, unsigned, o"
  7653. "signed. Los campos de bits de"
  7654. "longitud 1 deben declararse"
  7655. "como unsigned debido a que un"
  7656. "bit individual no puede tener"
  7657. "signo. Los nombres de los"
  7658. "campos son opcionales."
  7659. endv
  7660. beginv
  7661. cabecera " EJEMPLO "
  7662. color 14 2
  7663. coordenadas 40 3
  7664. "~struct operacion         ~"
  7665. "~  {                      ~"
  7666. "~    unsigned leer: 1;    ~"
  7667. "~    unsigned escribir: 1;~"
  7668. "~    unsigned abrir: 1;   ~"
  7669. "~    unsigned cerrar: 1;  ~"
  7670. "~    unsigned: 2;         ~"
  7671. "~    unsigned error: 1;   ~"
  7672. "~  } operacion_fichero;   ~"
  7673. ""
  7674. "A los campos de bits se ac-"
  7675. "cede de la misma forma que"
  7676. "a los campos de cualquier"
  7677. "estructura:"
  7678. ""
  7679. "~operacion_fichero.abrir = 1;~"
  7680. endv
  7681. beginv
  7682. coordenadas 1 4
  7683. color 14 4
  7684. "Los campos de bits tienen algunas restricciones: no se puede tomar la"
  7685. "dirección de una variable de campos de bits; en algunas máquinas, los"
  7686. "campos se disponen de izquierda a derecha y en otras de derecha a iz-"
  7687. "quierda, esto implica código menos portable."
  7688. endv
  7689. beginv
  7690. coordenadas 4 11
  7691. color 14 6
  7692. no_sombra
  7693. "Se puede mezclar elementos normales de estructura con elementos"
  7694. "de campos de bits. Por ejemplo:"
  7695. ""
  7696. "  ~struct st          ~"
  7697. "  ~  {                ~"
  7698. "  ~    char ch;       ~"
  7699. "  ~    unsigned c1: 1;~"
  7700. "  ~    unsigned c2: 3;~"
  7701. "  ~  };               ~"
  7702. ""
  7703. "El tamaño de esta estructura, sizeof (struct st), es 2: 1 byte"
  7704. "para ch y 1 byte para c1 y c2."
  7705. endv
  7706. borrar_pantalla
  7707. beginv
  7708. cabecera " UNIONES "
  7709. color 1 3
  7710. centrar_coordenadas_x 3
  7711. no_sombra
  7712. "Las uniones son similares a las estructuras. Su declaración"
  7713. "y utilización es exactamente igual que el de las estructuras"
  7714. "con la excepción que utiliza la palabra clave union en vez"
  7715. "de struct."
  7716. ""
  7717. "La diferencia que hay entre una variable estructura y una"
  7718. "variable unión es que es esta última todos sus elementos"
  7719. "ocupan la misma posición de memoria."
  7720. endv
  7721. beginvis
  7722. no_multiatributo
  7723. coordenadas_completas 3 4 78 23
  7724. borde 2
  7725. color 0 3
  7726. no_sombra
  7727. "Ejemplo:"
  7728. ""
  7729. "  #include <stdio.h>"
  7730. "  void main (void)"
  7731. "  {"
  7732. "    union { int x, y; } u;"
  7733. "    u.x = 10; /* también estamos haciendo u.y = 10, puesto"
  7734. "       que x e y comparten la misma posición de memoria */"
  7735. "    printf ("%d", u.y); /* imprime 10 */"
  7736. "  }"
  7737. ""
  7738. "El tamaño del tipo union es el tamaño del elemento que necesita"
  7739. "más memoria."
  7740. ""
  7741. "Ejemplo:"
  7742. ""
  7743. "  #include <stdio.h>"
  7744. "  void main (void)"
  7745. "  {"
  7746. "    union"
  7747. "      {"
  7748. "        char ch;"
  7749. "        int i;"
  7750. "      } u;"
  7751. "    u.i = 257;"
  7752. "    printf ("%d %d", u.ch, (char) u.i); /* imprime: «1 1» */"
  7753. "  }"
  7754. endvis
  7755. borrar_pantalla
  7756. beginv
  7757. cabecera " ENUMERACIONES "
  7758. coordenadas 1 2
  7759. color 1 2
  7760. "Una enumeración es un conjunto de constantes enteras"
  7761. "con nombre que especifica todos los valores válidos"
  7762. "que una variable de ese tipo puede tomar."
  7763. endv
  7764. beginv
  7765. coordenadas 1 8
  7766. color 4 2
  7767. "La forma general de declaración es:"
  7768. "  ~enum nombre_tipo_enum { lista_de_enumeracion } lista_variables;~"
  7769. "Aquí, al igual que con las estructuras, tanto el nombre de la enu-"
  7770. "meración nombre_tipo_enum como lista_variables son opcionales."
  7771. endv
  7772. beginvis
  7773. no_multiatributo
  7774. coordenadas_completas 1 15 78 23
  7775. color 0 2
  7776. borde 2
  7777. "Ejemplo:"
  7778. ""
  7779. "  enum colores { azul, rojo, amarillo };"
  7780. "  enum colores color;"
  7781. ""
  7782. "Dada esta declaración y definición la variable color sólo puede tomar tres"
  7783. "valores posibles: azul, rojo o amarillo."
  7784. ""
  7785. "Ejemplo:"
  7786. ""
  7787. "  color = rojo;"
  7788. "  if (color == azul)"
  7789. "    printf ("el color es azul");"
  7790. ""
  7791. "Cada uno de los símblos del conjunto de enumeración es un valor entero,"
  7792. "tomando el primero el valor 0, el segundo el valor 1 y así sucesivamente."
  7793. ""
  7794. "Ejemplo:"
  7795. ""
  7796. "  printf ("%d %d %d", azul, rojo, amarillo); /* muestra «0 1 2» */"
  7797. ""
  7798. "Podríamos haber dado otros valores numéricos a los símbolos si hubiésemos"
  7799. "declarado colores, por ejemplo, del siguiente modo:"
  7800. ""
  7801. "  enum colores { azul, rojo = 10, amarillo };"
  7802. ""
  7803. "Ahora la sentencia printf anterior mostraría «0 10 11»."
  7804. ""
  7805. "Como se ve, los símbolos no inicializados toman el valor numérico"
  7806. "siguiente al del símbolo anterior, excepto el primero que toma el"
  7807. "valor 0 si no es inicializado."
  7808. endvis
  7809. borrar_pantalla
  7810. beginv
  7811. cabecera " TIPOS DEFINIDOS POR EL USUARIO: typedef "
  7812. centrar_coordenadas_x 2
  7813. color 8 3
  7814. "El programador puede crear (dar nombre en realidad) tipos a partir"
  7815. "de los tipos ya definidos mediante la palabra clave ~typedef~."
  7816. endv
  7817. beginv
  7818. centrar_coordenadas_x 7
  7819. color 15 3
  7820. "La forma general de la sentencia typedef es:"
  7821. "  ~typedef tipo nombre;~"
  7822. "donde tipo es cualquier tipo de datos permitido"
  7823. "y nombre es el nuevo nombre para ese tipo."
  7824. endv
  7825. beginvis
  7826. no_multiatributo
  7827. coordenadas_completas 5 14 76 23
  7828. color 0 3
  7829. borde 2
  7830. "El uso de typedef hace más fácil de leer el código y más fácil"
  7831. "de transportar a una nueva máquina. Pero recuerda: NO se crea"
  7832. "ningún tipo de datos nuevo, sólo se da otro nombre."
  7833. ""
  7834. "Ejemplos:"
  7835. ""
  7836. " void main (void)"
  7837. " {"
  7838. "   typedef int boolean;"
  7839. "   boolean b; /* equivalente a: int b; */"
  7840. ""
  7841. "   typedef int vector[100];"
  7842. "   vector v; /* equivalente a: int v[100]; */"
  7843. ""
  7844. "   typedef char *pc;"
  7845. "   pc string; /* equivalente a: char *string; */"
  7846. ""
  7847. "   typedef void (*pf) (void);"
  7848. "   pf f; /* equivalente a: void (*f) (void); */"
  7849. ""
  7850. "   typedef struct { int x, y; } st;"
  7851. "   st estructura1;"
  7852. "               /* equivalente a: struct { int x, y; } estructura; */"
  7853. ""
  7854. "   struct st { int x, y; };"
  7855. "   typedef struct st s;"
  7856. "   s estructura2; /* equivalente a: struct st estructura; */"
  7857. ""
  7858. "   typedef int entero;"
  7859. "   typedef const entero * const puntero_constante_a_constante_entera;"
  7860. "   puntero_constante_a_constante_entera pcace;"
  7861. "                       /* equivalente a: const int * const pcace; */"
  7862. " }"
  7863. endvis
  7864. borrar_pantalla
  7865. beginvis
  7866. cabecera " PRECEDENCIA DE OPERADORES "
  7867. no_multiatributo
  7868. coordenadas_completas 1 2 80 24
  7869. color 0 3
  7870. borde 2
  7871. ""
  7872. "Con los operadores punto (.) y flecha (->) hemos completado el estudio"
  7873. "de todos los operadores de C. A continuación mostramos la tabla completa"
  7874. "de precedencia de operadores."
  7875. ""
  7876. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  7877. "  Precedencia de Operadores"
  7878. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  7879. "En la siguiente tabla de precedencia de operadores, los operadores son"
  7880. "divididos en 15 categorías."
  7881. ""
  7882. "La categoría #1 tiene la precedencia más alta; la categoría #2 (operadores"
  7883. "unarios) toma la segunda precedencia, y así hasta el operador coma, el"
  7884. "cual tiene la precedencia más baja."
  7885. ""
  7886. "Los operadores que están dentro de una misma categoría tienen igual"
  7887. "precedencia."
  7888. ""
  7889. "Los operadores unarios (categoría #2), condicional (categoría #13), y"
  7890. "de asignación (categoría #14) se asocian de derecha a izquierda; todos"
  7891. "los demás operadores se asocian de izquierda a derecha."
  7892. ""
  7893. "════════════════╤══════════╤════════════════════════════════════════════════"
  7894. "  #  Categoría  │ Operador │ Qué es (o hace)"
  7895. "════════════════╪══════════╪════════════════════════════════════════════════"
  7896. "  1. Más alto   │    ()    │ Llamada a función"
  7897. "                │    []    │ Indexamiento de array"
  7898. "                │    ->    │ Selector de componente indirecta"
  7899. "                │     .    │ Selector de componente directa"
  7900. "────────────────┼──────────┼────────────────────────────────────────────────"
  7901. "  2. Unario     │     !    │ Negación Lógica (NO)"
  7902. "                │     ~    │ Complemento a 1"
  7903. "                │     +    │ Más unario"
  7904. "                │     -    │ Menos unario"
  7905. "                │    ++    │ Preincremento o postincremento"
  7906. "                │    --    │ Predecremento o postdecremento"
  7907. "                │     &    │ Dirección"
  7908. "                │     *    │ Contenido (indirección)"
  7909. "                │  sizeof  │ (devuelve tamaño de operando, en bytes)"
  7910. "────────────────┼──────────┼────────────────────────────────────────────────"
  7911. "  3. Multipli-  │     *    │ Multiplica"
  7912. "     cativo     │     /    │ Divide"
  7913. "                │     %    │ Resto (módulo)"
  7914. "────────────────┼──────────┼────────────────────────────────────────────────"
  7915. "  4. Aditivo    │     +    │ Más binario"
  7916. "                │     -    │ Menos binario"
  7917. "────────────────┼──────────┼────────────────────────────────────────────────"
  7918. "  5. Desplaza-  │    <<    │ Desplazamiento a la izquierda"
  7919. "     miento     │    >>    │ Desplazamiento a la derecha"
  7920. "────────────────┼──────────┼────────────────────────────────────────────────"
  7921. "  6. Relacional │     <    │ Menor que"
  7922. "                │    <=    │ Menor o igual que"
  7923. "                │     >    │ Mayor que"
  7924. "                │    >=    │ Mayor o igual que"
  7925. "────────────────┼──────────┼────────────────────────────────────────────────"
  7926. "  7. Igualdad   │    ==    │ Igual a"
  7927. "                │    !=    │ Distinto a"
  7928. "────────────────┼──────────┼────────────────────────────────────────────────"
  7929. "  8.            │     &    │ AND entre bits"
  7930. "────────────────┼──────────┼────────────────────────────────────────────────"
  7931. "  9.            │     ^    │ XOR entre bits"
  7932. "────────────────┼──────────┼────────────────────────────────────────────────"
  7933. " 10.            │     |    │ OR entre bits"
  7934. "────────────────┼──────────┼────────────────────────────────────────────────"
  7935. " 11.            │    &&    │ AND lógico"
  7936. "────────────────┼──────────┼────────────────────────────────────────────────"
  7937. " 12.            │    ||    │ OR lógico"
  7938. "────────────────┼──────────┼────────────────────────────────────────────────"
  7939. " 13. Condicional│    ?:    │(a ? x : y significa "si a entonces x, si no y")"
  7940. "────────────────┼──────────┼────────────────────────────────────────────────"
  7941. " 14. Asignación │     =    │ Asignación simple"
  7942. "                │    *=    │ Asignar producto"
  7943. "                │    /=    │ Asignar cociente"
  7944. "                │    %=    │ Asignar resto (módulo)"
  7945. "                │    +=    │ Asignar suma"
  7946. "                │    -=    │ Asignar diferncia"
  7947. "                │    &=    │ Asignar AND entre bits"
  7948. "                │    ^=    │ Asignar XOR entre bits"
  7949. "                │    |=    │ Asignar OR entre bits"
  7950. "                │   <<=    │ Asignar desplazamiento hacia la izquierda"
  7951. "                │   >>=    │ Asignar desplazamiento hacia la derecha"
  7952. "────────────────┼──────────┼────────────────────────────────────────────────"
  7953. " 15. Coma       │     ,    │ Evaluar"
  7954. "════════════════╧══════════╧════════════════════════════════════════════════"
  7955. ""
  7956. endvis
  7957. end lección 8
  7958.  
  7959. ; LECCION 9
  7960. begin
  7961. beginv
  7962. borde 2
  7963. color 1 7
  7964. centrar_coordenadas
  7965. cabecera " INTRODUCCION A LA LECCION 9 "
  7966. "~  El objetivo de esta lección es hacer un estudio     ~"
  7967. "~  completo en todo lo referente a la entrada y,       ~"
  7968. "~  salida (E/S) en C, estudiando también los dos       ~"
  7969. "~  sistemas de ficheros que existen en este lenguaje.  ~"
  7970. ""
  7971. "Los puntos que se estudian en esta lección son:"
  7972. "- E/S estándar."
  7973. "- Flujos y ficheros."
  7974. "- Tipos de flujos: flujos de texto y flujos binarios."
  7975. "- Flujos predefinidos: ~stdin~, ~stdout~ y ~stderr~."
  7976. begint
  7977. "  (Turbo C añade además: ~stdaux~ y ~stdprn~)"
  7978. endt
  7979. "- Pasos a realizar para manipular un fichero: declarar"
  7980. "  variable de fichero, abrirlo, operar con él y cerrarlo."
  7981. "- Estructura ~FILE~."
  7982. "- Estudio completo del fichero ~stdio.h~."
  7983. begint
  7984. "  (tanto del ANSI C como de Turbo C)"
  7985. endt
  7986. "- Sistema de ficheros tipo UNIX."
  7987. "- Descriptores de ficheros."
  7988. begint
  7989. "- Estudio completo del fichero ~io.h~ en Turbo C."
  7990. endt
  7991. endv
  7992. borrar_pantalla
  7993. beginv
  7994. cabecera " ENTRADA Y SALIDA "
  7995. color 5 7
  7996. centrar_coordenadas_x 3
  7997. "Las operaciones de entrada y salida"
  7998. "(abreviadamente ~E/S~) no forman parte"
  7999. "del lenguaje C propiamente dicho, sino"
  8000. "que están en una biblioteca o librería:"
  8001. "~<stdio.h>~. Todo programa que utilice"
  8002. "funciones de entrada y salida estándar"
  8003. "deberá contener la línea:"
  8004. ""
  8005. "#include <stdio.h>."
  8006. endv
  8007. beginv
  8008. cabecera " E/S estándar "
  8009. centrar_coordenadas_x 6
  8010. color 6 7
  8011. "Por defecto, la entrada estándar es el teclado y la salida"
  8012. "estándar es la pantalla o monitor. Hay dos formas básicas"
  8013. "de cambiar la entrada y la salida estándar:"
  8014. ""
  8015. "  1. Con los símbolos de redirección (<, >, <<, >>) o de"
  8016. "     tubería (|) del sistema operativo al ejecutar el"
  8017. "     programa desde la línea de órdenes."
  8018. ""
  8019. "  2. Con determinadas funciones y variables que se"
  8020. "     encuentran en la librería <stdio.h> en el código"
  8021. "     fuente del programa."
  8022. endv
  8023. beginv
  8024. cabecera " FLUJOS Y FICHEROS "
  8025. centrar_coordenadas_x 9
  8026. color 1 7
  8027. "Hay dos conceptos muy importantes en C relacionados con la E/S: flujos"
  8028. "(streams, en inglés) y ficheros. Los ~flujos~ son sucesiones de caracteres"
  8029. "a través de los cuales realizamos las operaciones de E/S. Para el progra-"
  8030. "mador todos los flujos son iguales. Para el C (en general para el siste-"
  8031. "ma operativo) un ~fichero~ es un concepto lógico que puede ser aplicado a"
  8032. "cualquier cosa desde ficheros de discos a terminales. A cada fichero se"
  8033. "le asigna un flujo al realizar la operación de apertura sobre él. Para el"
  8034. "programador un fichero es un dispositivo externo capaz de una E/S. Todos"
  8035. "los ficheros no son iguales pero todos los flujos sí. Esto supone una"
  8036. "gran simplificación para el usuario, ya que sólo tiene que pensar en tér-"
  8037. "minos de flujo y no de dispositivos concretos. Por ejemplo, si el usuario"
  8038. "hace: printf ("mensaje"); sabe que «mensaje» se escribe en el flujo es-"
  8039. "tándar de salida, ya sea la pantalla, un fichero de disco, una cinta, ..."
  8040. endv
  8041. beginv
  8042. cabecera " TIPOS DE FLUJOS "
  8043. centrar_coordenadas
  8044. color 0 7
  8045. "Cuando hemos dicho que todos los flujos son iguales, es cierto que lo son"
  8046. "en su utilización por parte del programador, pero en realidad, podemos"
  8047. "distinguir dos tipos:"
  8048. "  - ~Flujos de texto~: son una sucesión de caracteres originado en líneas"
  8049. "    que finalizan con un carácter de nueva-línea. En estos flujos puede no"
  8050. "    haber una relación de uno a uno entre los caracteres que son escritos"
  8051. "    (leídos) y los del dispositivo externo, por ejemplo, una nueva-línea"
  8052. "    puede transformarse en un par de caracteres (un retorno de carro y un"
  8053. "    carácter de salto de línea)."
  8054. "  - ~Flujos binarios~: son flujos de bytes que tienen una correspondencia"
  8055. "    uno a uno con los que están almacenados en el dispositivo externo. Esto"
  8056. "    es, no se presentan desplazamientos de caracteres. Además el número de"
  8057. "    bytes escritos (leídos) es el mismo que los almacenados en el disposi-"
  8058. "    tivo externo."
  8059. "Esta diferencia de flujos es importante tenerla en cuenta al leer ficheros"
  8060. "de discos. Supongamos que tenemos un fichero de disco con 7 caracteres donde"
  8061. "el cuarto carácter es el carácter fin de fichero (en sistema operativo DOS"
  8062. "es el carácter con código ASCII 26). Si abrimos el fichero en modo texto,"
  8063. "sólo podemos leer los 3 primeros caracteres, sin embargo, si lo abrimos en"
  8064. "modo binario, leeremos los 7 caracteres ya que el carácter con código ASCII"
  8065. "26 es un carácter como cualquier otro."
  8066. endv
  8067. beginv
  8068. cabecera " PROGRAMAS C CON FLUJOS "
  8069. centrar_coordenadas
  8070. color 4 7
  8071. "Al principio de la ejecución de un programa C se abren tres flujos de"
  8072. "tipo texto predefinidos:"
  8073. ""
  8074. "  ~stdin ~: dispositivo de entrada estándar"
  8075. "  ~stdout~: dispositivo de salida estándar"
  8076. "  ~stderr~: dispositivo de salidad de error estándar"
  8077. ""
  8078. "Al finalizar el programa, bien volviendo de la función main al sistema"
  8079. "operativo o bien por una llamada a exit(), todos los ficheros se cierran"
  8080. "automáticamente. No se cerrarán si el programa termina a través de una"
  8081. "llamada a abort() o abortando el programa."
  8082. ""
  8083. "Estos tres ficheros no pueden abrirse ni cerrarse explicítamente."
  8084. begint
  8085. ""
  8086. "En Turbo C, además de abrirse los tres flujos anteriores se abren otros"
  8087. "dos flujos de texto predefinidos:"
  8088. ""
  8089. "  ~stdaux~: dispositivo auxiliar estándar"
  8090. "  ~stdprn~: impresora estándar"
  8091. endt
  8092. endv
  8093. beginv
  8094. cabecera " RESUMEN DE TODO LO DICHO HASTA EL MOMENTO EN ESTA LECCION "
  8095. centrar_coordenadas
  8096. color 15 7
  8097. ""
  8098. "Como todo lo que acabamos de decir puede resultar un poco confuso"
  8099. "a las personas que tienen poca experiencia en C, vamos a hacer un"
  8100. "pequeño resumen en términos generales:"
  8101. ""
  8102. "1. En C, cualquier cosa externa de la que podemos leer o en la que"
  8103. "   podemos escribir datos es un fichero."
  8104. ""
  8105. "2. El programador escribe (lee) datos en estos ficheros a través de"
  8106. "   los flujos de cada fichero. De esta forma el programador escribe"
  8107. "   (lee) los datos de la misma forma en todos los tipos de ficheros"
  8108. "   independientemente del tipo de fichero que sea."
  8109. ""
  8110. "3. Aunque conceptualmente todos los flujos son iguales, en realidad"
  8111. "   hay dos tipos: flujos de texto y flujos binarios."
  8112. ""
  8113. "4. Hay tres flujos de texto predefinidos que se abren automática-"
  8114. "   mente al principio del programa: stdin, stdout y stderr. Estos"
  8115. "   tres flujos se cierran automáticamente al final del programa."
  8116. ""
  8117. endv
  8118. borrar_pantalla
  8119. beginvis
  8120. no_multiatributo
  8121. no_posicion
  8122. cabecera " PASOS PARA OPERAR CON UN FICHERO "
  8123. coordenadas_completas 3 3 78 23
  8124. color 1 7
  8125. borde 2
  8126. "Los pasos a realizar para realizar operaciones con un fichero son los"
  8127. "siguientes:"
  8128. ""
  8129. "1) Crear un nombre interno de fichero. Esto se hace en C declarando un"
  8130. "puntero de fichero (o puntero a fichero). Un puntero de fichero es una"
  8131. "variable puntero que apunta a una estructura llamada FILE. Esta estruc-"
  8132. "tura está definida en el fichero stdio.h y contiene toda la información"
  8133. "necesaria para poder trabajar con un fichero. El contenido de esta es-"
  8134. "tructura es dependiente de la implementación de C y del sistema, y no"
  8135. "es interesante saberlo para el programador."
  8136. ""
  8137. "Ejemplo:"
  8138. ""
  8139. "  FILE *pf; /* pf es un puntero de fichero */"
  8140. ""
  8141. "2) Abrir el fichero. Esto se hace con la función fopen() cuyo prototipo"
  8142. "se encuentra en el fichero stdio.h y es:"
  8143. ""
  8144. "  FILE *fopen (char *nombre_fichero, char *modo);"
  8145. ""
  8146. "Si el fichero con nombre nombre_fichero no se puede abrir devuelve NULL."
  8147. ""
  8148. "El parámetro nombre_fichero puede contener la ruta completa de fichero"
  8149. "pero teniendo en cuenta que la barra invertida (\) hay que repetirla en"
  8150. "una cadena de caracteres."
  8151. ""
  8152. "Los valores válidos para el parámeto modo son:"
  8153. ""
  8154. "  Modo    Interpretación"
  8155. "  ----    -----------------------------------------------"
  8156. "  "r"     Abrir un fichero texto para lectura"
  8157. "  "w"     Crear un fichero texto para escritura"
  8158. "  "a"     Añadir a un fichero texto"
  8159. "  "rb"    Abrir un fichero binario para lectura"
  8160. "  "wb"    Crear un fichero binario para escritura"
  8161. "  "ab"    Añadir a un fichero binario"
  8162. "  "r+"    Abrir un fichero texto para lectura/escritura"
  8163. "  "w+"    Crear un fichero texto para lectura/escritura"
  8164. "  "a+"    Abrir un fichero texto para lectura/escritura"
  8165. "  "rb+"   Abrir un fichero binario para lectura/escritura"
  8166. "  "wb+"   Crear un fichero binario para lectura/escritura"
  8167. "  "ab+"   Abrir un fichero binario para lectura/escritura"
  8168. ""
  8169. "Si se utiliza fopen() para abrir un fichero para escritura, entonces"
  8170. "cualquier fichero que exista con ese nombre es borrado y se comienza"
  8171. "con un fichero nuevo. Si no existe un fichero con ese nombre, entonces"
  8172. "se crea uno. Si lo que se quiere es añadir al final del fichero, se"
  8173. "debe utilizar el modo "a". Si no existe el fichero, devuelve error."
  8174. "Abrir un fichero para operaciones de lectura necesita que el fichero"
  8175. "exista. Si no existe devuelve error. Finalmente, si se abre un fichero"
  8176. "para operaciones de lectura/escritura, no se borra en caso de existir."
  8177. "Sin embargo, si no existe se crea."
  8178. ""
  8179. "Ejemplo:"
  8180. ""
  8181. "  FILE *pf;"
  8182. "  pf = fopen ("c:\\autoexec.bat", "r");"
  8183. "  if (pf == NULL) /* siempre se debe hacer esta comprobación */"
  8184. "    {"
  8185. "      puts ("No se puede abrir fichero.");"
  8186. "      exit (1);"
  8187. "    }"
  8188. ""
  8189. "3) Realizar las operaciones deseadas con el fichero como pueden ser la"
  8190. "escritura en él y la lectura de él. Las funciones que disponemos para"
  8191. "hacer esto las veremos un poco más adelante."
  8192. ""
  8193. "4) Cerrar el fichero. Aunque el C cierra automáticamente todos los"
  8194. "ficheros abiertos al terminar el programa, es muy aconsejable cerrarlos"
  8195. "explícitamente. Esto se hace con la función fclose() cuyo prototipo es:"
  8196. ""
  8197. "  int fclose (FILE *pf);"
  8198. ""
  8199. "La función fclose() cierra el fichero asociado con el flujo pf y vuelca"
  8200. "su buffer."
  8201. ""
  8202. "Si fclose() se ejecuta correctamente devuelve el valor 0. La comproba"
  8203. "ción del valor devuelto no se hace muchas veces porque no suele fallar."
  8204. ""
  8205. "Ejemplo:"
  8206. ""
  8207. "  FILE *pf;"
  8208. "  if ((pf = fopen ("prueba", "rb")) == NULL)"
  8209. "    {"
  8210. "      puts ("Error al intentar abrir el fichero.");"
  8211. "      exit (1);"
  8212. "    }"
  8213. "  /* ... */"
  8214. "  if (fclose (pf) != 0)"
  8215. "    {"
  8216. "      puts ("Error al intentar cerrar el fichero.");"
  8217. "      exit (1);"
  8218. "    }"
  8219. endvis
  8220. beginv
  8221. cabecera " RESUMEN DE LOS PASOS PARA MANIPULAR UN FICHERO "
  8222. centrar_coordenadas
  8223. color 0 7
  8224. "Resumen de los 4 pasos anteriores para la manipulación de un fichero:"
  8225. ""
  8226. "1) Declarar un puntero de fichero."
  8227. "  ~FILE *pf;~"
  8228. ""
  8229. "2) Abrirlo el fichero."
  8230. "  ~if ((pf = fopen ("nombre_fichero", "modo_apertura")) == NULL)~"
  8231. "  ~  error ();                                                  ~"
  8232. "  ~else                                                         ~"
  8233. "  ~  /* ... */                                                  ~"
  8234. ""
  8235. "3) Realizar las operaciones deseadas con el fichero."
  8236. "  ~/* En las siguientes ventanas veremos las~"
  8237. "  ~   funciones que tenemos para ello. */   ~"
  8238. ""
  8239. "4) Cerrar el fichero."
  8240. "  ~if (fclose (pf) != 0)~"
  8241. "  ~  error ();          ~"
  8242. "  ~else                 ~"
  8243. "  ~  /* ... */          ~"
  8244. endv
  8245. borrar_pantalla
  8246. beginvis
  8247. no_multiatributo
  8248. no_posicion
  8249. cabecera " FUNCIONES DEL ANSI C EN FICHERO DE CABECERA STDIO.H "
  8250. coordenadas_completas 1 2 80 24
  8251. color 0 3
  8252. borde 2
  8253. "GLOSARIO:"
  8254. ""
  8255. " ▄▄▄▄▄▄▄▄"
  8256. " ▌fclose▐   Cierra un flujo."
  8257. " ▀▀▀▀▀▀▀▀"
  8258. " ▄▄▄▄▄▄"
  8259. " ▌feof▐   Macro que devuelve un valor distinto de cero si se se ha detectado"
  8260. " ▀▀▀▀▀▀   el fin de fichero en un flujo."
  8261. " ▄▄▄▄▄▄▄▄"
  8262. " ▌ferror▐   Macro que devuelve un valor distinto de cero si ha ocurrido algún"
  8263. " ▀▀▀▀▀▀▀▀   error en el flujo."
  8264. " ▄▄▄▄▄▄▄▄"
  8265. " ▌fflush▐   Vuelca un flujo."
  8266. " ▀▀▀▀▀▀▀▀"
  8267. " ▄▄▄▄▄▄▄"
  8268. " ▌fgetc▐   Obtiene un carácter de un flujo."
  8269. " ▀▀▀▀▀▀▀"
  8270. " ▄▄▄▄▄▄▄▄▄▄"
  8271. " ▌fgetchar▐   Obtiene un carácter de stdin."
  8272. " ▀▀▀▀▀▀▀▀▀▀"
  8273. " ▄▄▄▄▄▄▄"
  8274. " ▌fgets▐   Obtiene una cadena de caracteres de un flujo."
  8275. " ▀▀▀▀▀▀▀"
  8276. " ▄▄▄▄▄▄▄"
  8277. " ▌fopen▐   Abre un flujo."
  8278. " ▀▀▀▀▀▀▀"
  8279. " ▄▄▄▄▄▄▄▄▄"
  8280. " ▌fprintf▐   Envía salida formateada a un flujo."
  8281. " ▀▀▀▀▀▀▀▀▀"
  8282. " ▄▄▄▄▄▄▄"
  8283. " ▌fputc▐   Escribe un carácter en un flujo."
  8284. " ▀▀▀▀▀▀▀"
  8285. " ▄▄▄▄▄▄▄▄▄▄"
  8286. " ▌fputchar▐   Escribe un carácter en stdout."
  8287. " ▀▀▀▀▀▀▀▀▀▀"
  8288. " ▄▄▄▄▄▄▄"
  8289. " ▌fputs▐   Escribe una cadena de caracteres en un flujo."
  8290. " ▀▀▀▀▀▀▀"
  8291. " ▄▄▄▄▄▄▄"
  8292. " ▌fread▐   Lee datos de un flujo."
  8293. " ▀▀▀▀▀▀▀"
  8294. " ▄▄▄▄▄▄▄▄▄"
  8295. " ▌freopen▐   Asocia un nuevo fichero con un flujo abierto."
  8296. " ▀▀▀▀▀▀▀▀▀"
  8297. " ▄▄▄▄▄▄▄▄"
  8298. " ▌fscanf▐   Ejecuta entrada formateada de un flujo."
  8299. " ▀▀▀▀▀▀▀▀"
  8300. " ▄▄▄▄▄▄▄"
  8301. " ▌fseek▐   Posiciona el puntero de fichero de un flujo."
  8302. " ▀▀▀▀▀▀▀"
  8303. " ▄▄▄▄▄▄▄"
  8304. " ▌ftell▐   Devuelve la posición actual del puntero de fichero."
  8305. " ▀▀▀▀▀▀▀"
  8306. " ▄▄▄▄▄▄▄▄"
  8307. " ▌fwrite▐   Escribe en un flujo."
  8308. " ▀▀▀▀▀▀▀▀"
  8309. " ▄▄▄▄▄▄"
  8310. " ▌getc▐   Macro que obtiene un carácter de un flujo."
  8311. " ▀▀▀▀▀▀"
  8312. " ▄▄▄▄▄▄▄▄▄"
  8313. " ▌getchar▐   Macro que obtiene un carácer de stdin."
  8314. " ▀▀▀▀▀▀▀▀▀"
  8315. " ▄▄▄▄▄▄"
  8316. " ▌gets▐   Obtiene una cadena de caracteres de stdin."
  8317. " ▀▀▀▀▀▀"
  8318. " ▄▄▄▄▄▄▄▄"
  8319. " ▌perror▐   Mensajes de error del sistema."
  8320. " ▀▀▀▀▀▀▀▀"
  8321. " ▄▄▄▄▄▄▄▄"
  8322. " ▌printf▐   Escribe con formateo a stdout."
  8323. " ▀▀▀▀▀▀▀▀"
  8324. " ▄▄▄▄▄▄"
  8325. " ▌putc▐   Escribe un carácter en un flujo."
  8326. " ▀▀▀▀▀▀"
  8327. " ▄▄▄▄▄▄▄▄▄"
  8328. " ▌putchar▐   Escribe un carácter en stdout."
  8329. " ▀▀▀▀▀▀▀▀▀"
  8330. " ▄▄▄▄▄▄"
  8331. " ▌puts▐   Escribe un string en stdout (y añade un carácter de nueva línea)."
  8332. " ▀▀▀▀▀▀"
  8333. " ▄▄▄▄▄▄▄▄"
  8334. " ▌remove▐   Función que borra un fichero."
  8335. " ▀▀▀▀▀▀▀▀"
  8336. " ▄▄▄▄▄▄▄▄"
  8337. " ▌rename▐   Renombra un fichero."
  8338. " ▀▀▀▀▀▀▀▀"
  8339. " ▄▄▄▄▄▄▄▄"
  8340. " ▌rewind▐   Reposiciona el puntero de fichero al comienzo del flujo."
  8341. " ▀▀▀▀▀▀▀▀"
  8342. " ▄▄▄▄▄▄▄"
  8343. " ▌scanf▐  Ejecuta entrada formateada de stdin."
  8344. " ▀▀▀▀▀▀▀"
  8345. " ▄▄▄▄▄▄▄▄"
  8346. " ▌setbuf▐   Asigna un buffer a un flujo."
  8347. " ▀▀▀▀▀▀▀▀"
  8348. " ▄▄▄▄▄▄▄▄▄"
  8349. " ▌setvbuf▐   Asigna un buffer a un flujo."
  8350. " ▀▀▀▀▀▀▀▀▀"
  8351. " ▄▄▄▄▄▄▄▄▄"
  8352. " ▌sprintf▐   Envía salida formateada a un string."
  8353. " ▀▀▀▀▀▀▀▀▀"
  8354. " ▄▄▄▄▄▄▄▄"
  8355. " ▌sscanf▐   Ejecuta entrada formateada de string."
  8356. " ▀▀▀▀▀▀▀▀"
  8357. " ▄▄▄▄▄▄▄▄▄"
  8358. " ▌tmpfile▐   Abre un fichero temporal en modo binario."
  8359. " ▀▀▀▀▀▀▀▀▀"
  8360. " ▄▄▄▄▄▄▄▄"
  8361. " ▌tmpnam▐   Crea un nombre de fichero único."
  8362. " ▀▀▀▀▀▀▀▀"
  8363. " ▄▄▄▄▄▄▄▄"
  8364. " ▌ungetc▐   Devuelve un carácter al flujo de entrada."
  8365. " ▀▀▀▀▀▀▀▀"
  8366. " ▄▄▄▄▄▄▄▄▄▄"
  8367. " ▌vfprintf▐   Envía salida formateada a un flujo usando una lista de"
  8368. " ▀▀▀▀▀▀▀▀▀▀   argumentos."
  8369. " ▄▄▄▄▄▄▄▄▄"
  8370. " ▌vfscanf▐   Ejecuta entrada formateada de un flujo usando una lista de"
  8371. " ▀▀▀▀▀▀▀▀▀   argumentos."
  8372. " ▄▄▄▄▄▄▄▄▄"
  8373. " ▌vprintf▐   Envía salida formateada a stdout usando una lista de"
  8374. " ▀▀▀▀▀▀▀▀▀   argumentos."
  8375. " ▄▄▄▄▄▄▄▄"
  8376. " ▌vscanf▐   Ejecuta entrada formateada de stdin usando una lista de"
  8377. " ▀▀▀▀▀▀▀▀   argumentos."
  8378. " ▄▄▄▄▄▄▄▄▄▄"
  8379. " ▌vsprintf▐   Envía salida formateada a un string usando una lista de"
  8380. " ▀▀▀▀▀▀▀▀▀▀   argumentos."
  8381. " ▄▄▄▄▄▄▄▄▄"
  8382. " ▌vsscanf▐   Ejecuta entrada formateada de un string usando una lista de"
  8383. " ▀▀▀▀▀▀▀▀▀   argumentos."
  8384. ""
  8385. ""
  8386. "ESTUDIO DE LAS FUNCIONES EXPUESTAS EN EL GLOSARIO:"
  8387. ""
  8388. " ▄▄▄▄▄▄▄▄"
  8389. " ▌fclose▐   Cierra un flujo."
  8390. " ▀▀▀▀▀▀▀▀"
  8391. " Sintaxis:"
  8392. "   int fclose (FILE *flujo);"
  8393. ""
  8394. "Devuelve 0 si tiene éxito; devuelve EOF si se detecta algún error."
  8395. ""
  8396. "Un error puede ocurrir por ejemplo cuando se intenta cerrar un fichero que"
  8397. "ha sido ya cerrado."
  8398. ""
  8399. "Ejemplo:"
  8400. ""
  8401. "  FILE *pf;"
  8402. ""
  8403. "  if ((pf = fopen ("prueba", "r")) == NULL)"
  8404. "    error ();"
  8405. ""
  8406. "  /* ... */"
  8407. ""
  8408. "  if (fclose (pf))"
  8409. "    error ();"
  8410. ""
  8411. ""
  8412. " ▄▄▄▄▄▄"
  8413. " ▌feof▐   Macro que devuelve un valor distinto de cero si se se ha detectado"
  8414. " ▀▀▀▀▀▀   el fin de fichero en un flujo."
  8415. ""
  8416. "Sintaxis:"
  8417. "  int feof (FILE *flujo);"
  8418. ""
  8419. "Una vez alcanzado el final del fichero, las operaciones posteriores de"
  8420. "lectura devuelven EOF hasta que se cambie la posición del puntero del"
  8421. "fichero con funciones como rewind() y fseek()."
  8422. ""
  8423. "La función feof() es particularmente útil cuando se trabaja con ficheros"
  8424. "binarios porque la marca de fin de fichero es también un entero binario"
  8425. "válido."
  8426. ""
  8427. "Ejemplo:"
  8428. ""
  8429. "  /* supone que pf se ha abierto como fichero"
  8430. "     binario para operaciones de lectura */"
  8431. ""
  8432. "  while (! feof (pf))"
  8433. "    getc (pf);"
  8434. ""
  8435. ""
  8436. " ▄▄▄▄▄▄▄▄"
  8437. " ▌ferror▐   Macro que devuelve un valor distinto de cero si ha ocurrido algún"
  8438. " ▀▀▀▀▀▀▀▀   error en el flujo."
  8439. ""
  8440. "Sintaxis:"
  8441. "  int ferror (FILE *flujo);"
  8442. ""
  8443. "Los indicadores de error asociados al flujo permanecen activos hasta que se"
  8444. "cierra el fichero, se llama a rewind() o a perror()."
  8445. ""
  8446. "Ejemplo:"
  8447. ""
  8448. "  /* supone que pf apunta a un flujo abierto"
  8449. "     para operaciones de escritura */"
  8450. ""
  8451. "  putc (informacion, pf);"
  8452. "  if (ferror (pf))"
  8453. "    error ();"
  8454. ""
  8455. ""
  8456. " ▄▄▄▄▄▄▄▄"
  8457. " ▌fflush▐   Vuelca un flujo."
  8458. " ▀▀▀▀▀▀▀▀"
  8459. ""
  8460. " Sintaxis:"
  8461. "   int fflush (FILE *flujo);"
  8462. ""
  8463. "Si el flujo está asociado a un fichero para escritura, una llamada a"
  8464. "fflush() da lugar a que el contenido del buffer de salida se escriba"
  8465. "en el fichero. Si flujo apunta a un fichero de entrada, entonces el"
  8466. "contenido del buffer de entrada se vacía. En ambos casos el fichero"
  8467. "permanece abierto."
  8468. ""
  8469. "Devuelve EOF si se detecta algún error."
  8470. ""
  8471. "Ejemplo:"
  8472. ""
  8473. "  /* supone que pf está asociado"
  8474. "     con un fichero de salida */"
  8475. ""
  8476. "  fwrite (buffer, sizeof (tipo_de_dato), n, pf);"
  8477. "  fflush (pf);"
  8478. ""
  8479. ""
  8480. " ▄▄▄▄▄▄▄"
  8481. " ▌fgetc▐   Obtiene un carácter de un flujo."
  8482. " ▀▀▀▀▀▀▀"
  8483. ""
  8484. " Sintaxis:"
  8485. "   int fgetc (FILE *flujo);"
  8486. ""
  8487. "La función fgetc() devuelve el siguiente carácter desde el flujo de"
  8488. "entrada e incrementa el indicador de posición del fichero. El carácter"
  8489. "se lee como un unsigned char que se convierte a entero."
  8490. ""
  8491. "Si se alcanza el final del fichero, fgetc() devuelve EOF. Recuerda que"
  8492. "EOF es un valor entero. Por tanto, cuando trabajes con ficheros binarios"
  8493. "debes utilizar feof() para comprobar el final del fichero. Si fgetc()"
  8494. "encuentra un error, devuelve EOF también. En consecuencia, si trabajas"
  8495. "con ficheros binarios debe utilizar ferror() para comprobar los errores"
  8496. "del fichero."
  8497. ""
  8498. "Ejemplo:"
  8499. ""
  8500. "  /* supone que pf está asociado"
  8501. "     con un fichero de entrada */"
  8502. ""
  8503. "  while ((ch = fgetc (pf)) != EOF)"
  8504. "    printf ("%c", ch);"
  8505. ""
  8506. ""
  8507. " ▄▄▄▄▄▄▄▄▄▄"
  8508. " ▌fgetchar▐   Obtiene un carácter de stdin."
  8509. " ▀▀▀▀▀▀▀▀▀▀"
  8510. ""
  8511. " Sintaxis:"
  8512. "   int fgetchar (void);"
  8513. ""
  8514. "Si tiene éxito, getchar() devuelve el carácter leído, después de conver-"
  8515. "tirlo a int sin extensión de signo. En caso de fin de fichero o error,"
  8516. "devuelve EOF."
  8517. ""
  8518. "Ejemplo:"
  8519. ""
  8520. "  ch = getchar ();"
  8521. ""
  8522. ""
  8523. " ▄▄▄▄▄▄▄"
  8524. " ▌fgets▐   Obtiene una cadena de caracteres de un flujo."
  8525. " ▀▀▀▀▀▀▀"
  8526. ""
  8527. " Sintaxis:"
  8528. "   char *fgets (char *s, int n, FILE *flujo);"
  8529. ""
  8530. "La función fgets() lee hasta n-1 caracteres desde el flujo y los sitúa en"
  8531. "el array apuntado por s. Los caracteres se leen hasta que se recibe un"
  8532. "carácter de nueva línea o un EOF o hasta que se llega al límite especifi-"
  8533. "cado. Después de leídos los caracteres, se sitúa en el array un carácter"
  8534. "nulo inmediatamente después del último carácter leído. Se guarda un carác-"
  8535. "ter de nueva línea y forma parte de s."
  8536. ""
  8537. "Si fgets() tiene éxito devuelve la dirección de s; se devuelve un puntero"
  8538. "nulo cuando se produce un error. Ya que se devuelve un puntero nulo cuando"
  8539. "se produce un error o cuando se alcanza el final del fichero, utiliza feof()"
  8540. "o ferror() para identificar lo que ocurre realmente."
  8541. ""
  8542. "Ejemplo:"
  8543. ""
  8544. "  /* supone que pf está asociado con"
  8545. "     un fichero de entrada */"
  8546. ""
  8547. "  while (! feof (pf))"
  8548. "    if (fgets (s, 126, pf))"
  8549. "      printf ("%s", s);"
  8550. ""
  8551. ""
  8552. " ▄▄▄▄▄▄▄"
  8553. " ▌fopen▐   Abre un flujo."
  8554. " ▀▀▀▀▀▀▀"
  8555. ""
  8556. " Sintaxis:"
  8557. "   FILE *fopen (const char *nombre_fichero, const char *modo_apertura);"
  8558. ""
  8559. "Devuelve un puntero al flujo abierto si tiene éxito; en otro caso devuelve"
  8560. "NULL."
  8561. ""
  8562. "Esta ha sido explicada más extensa en ventanas anteriores."
  8563. ""
  8564. "Ejemplo:"
  8565. ""
  8566. "  FILE *pf;"
  8567. ""
  8568. "  if ((pf = fopen ("prueba", "r")) == NULL)"
  8569. "    error ();"
  8570. ""
  8571. ""
  8572. " ▄▄▄▄▄▄▄▄▄"
  8573. " ▌fprintf▐   Envía salida formateada a un flujo."
  8574. " ▀▀▀▀▀▀▀▀▀"
  8575. ""
  8576. " Sintaxis:"
  8577. "   int fprintf (FILE *flujo, const char *formato[, argumento, ...]);"
  8578. ""
  8579. "Esta función es idéntica a la función printf() con la excepción que printf()"
  8580. "escribe en la salida estándar (flujo stdout) y la función fprintf() escribe"
  8581. "en la salida especificada (flujo indicado en su primer argumento)."
  8582. ""
  8583. "Ejemplo:"
  8584. ""
  8585. "  /* supone que pf está asociado con"
  8586. "     un fichero de salida */"
  8587. ""
  8588. "  fprintf (pf, "esto es una prueba %d %f", 5, 2.3);"
  8589. ""
  8590. ""
  8591. " ▄▄▄▄▄▄▄"
  8592. " ▌fputc▐   Escribe un carácter en un flujo."
  8593. " ▀▀▀▀▀▀▀"
  8594. ""
  8595. " Sintaxis:"
  8596. "   int fputc (int c, FILE *flujo);"
  8597. ""
  8598. "La función fputc() escribe un carácter c en el flujo especificado a partir"
  8599. "de la posición actual del fichero y entonces incrementa el indicador de"
  8600. "posición del fichero. Aunque ch tradicionalmente se declare de tipo int,"
  8601. "es convertido por fputc() en unsigned char. Puesto que todos los argumentos"
  8602. "de tipo carácter son pasados a enteros en el momento de la llamada, se"
  8603. "seguirán viendo variables de tipo carácter como argumentos. Si se utilizara"
  8604. "un entero, simplemente se eliminaría el byte más significativo."
  8605. ""
  8606. "El valor devuelto por fputc() es el valor de número de carácter escrito. Si"
  8607. "se produce un error, se devuelve EOF. Para los ficheros abiertos en opera-"
  8608. "ciones binarias, EOF puede ser un carácter válido. En estos casos, para"
  8609. "determinar si realmente se ha producido un error utiliza la función ferror()."
  8610. ""
  8611. "Ejemplo:"
  8612. ""
  8613. "  /* supone que pf está asociado con"
  8614. "     un fichero de salida */"
  8615. ""
  8616. "  fputc ('a', pf);"
  8617. ""
  8618. ""
  8619. " ▄▄▄▄▄▄▄▄▄▄"
  8620. " ▌fputchar▐   Escribe un carácter en stdout."
  8621. " ▀▀▀▀▀▀▀▀▀▀"
  8622. ""
  8623. " Sintaxis:"
  8624. "   int fputchar (int c);"
  8625. ""
  8626. "Una llamada a fputchar() es funcionalmente equivalente a fputc(c,stdout)."
  8627. ""
  8628. "Ejemplo:"
  8629. ""
  8630. "  /* supone que pf está asociado con"
  8631. "     un fichero de salida */"
  8632. ""
  8633. "  fputchar ('a');"
  8634. ""
  8635. ""
  8636. " ▄▄▄▄▄▄▄"
  8637. " ▌fputs▐   Escribe una cadena de caracteres en un flujo."
  8638. " ▀▀▀▀▀▀▀"
  8639. ""
  8640. " Sintaxis:"
  8641. "   int fputs (const char *s, FILE *flujo);"
  8642. ""
  8643. "La función fputs() escribe el contenido de la cadena de caracteres"
  8644. "apuntada por s en el flujo especificado. El carácter nulo de terminación"
  8645. "no se escribe."
  8646. ""
  8647. "La función devuelve 0 cuando tiene éxito, y un valor no nulo bajo"
  8648. "condición de error."
  8649. ""
  8650. "Si se abre el flujo en modo texto, tienen lugar ciertas transformaciones"
  8651. "de caracteres. Esto supone que puede ser que no haya una correspondencia"
  8652. "uno a uno de la cadena frente al fichero. Sin embargo, si se abre en mo-"
  8653. "do binario, no se producen transformaciones de caracteres y se establece"
  8654. "una correspondencia uno a uno entre la cadena y el fichero."
  8655. ""
  8656. "Ejemplo:"
  8657. ""
  8658. "  /* supone que pf está asociado con"
  8659. "     un fichero de salida */"
  8660. ""
  8661. "  fputs ("abc", pf);"
  8662. ""
  8663. ""
  8664. " ▄▄▄▄▄▄▄"
  8665. " ▌fread▐   Lee datos de un flujo."
  8666. " ▀▀▀▀▀▀▀"
  8667. ""
  8668. " Sintaxis:"
  8669. "   int fread (void *buf, int tam, int n, FILE *flujo);"
  8670. ""
  8671. "Lee n elementos de tam bytes cada uno. Devuelve el número de elementos (no"
  8672. "bytes) realmente leídos. Si se han leído menos caracteres de los pedidos en"
  8673. "la llamada, es que se ha producido un error o es que se ha alcanzado el"
  8674. "final del fichero. Utiliza feof() o ferror() para determinar lo que ha"
  8675. "tenido lugar."
  8676. ""
  8677. "Si el flujo se abre para operaciones de texto, el flujo de retorno de carro"
  8678. "y salto de línea se transforma automáticamente en un carácter de nueva línea."
  8679. ""
  8680. "Ejemplo:"
  8681. ""
  8682. "  /* supone que pf está asociado con"
  8683. "     un fichero de entrada */"
  8684. ""
  8685. "  float buf[10];"
  8686. ""
  8687. "  if (fread (buf, sizeof (float), 10, pf) != 10)"
  8688. "    if (feof (pf))"
  8689. "      printf ("fin de fichero inesperado");"
  8690. "    else"
  8691. "      printf ("error de lectura en el fichero");"
  8692. ""
  8693. ""
  8694. " ▄▄▄▄▄▄▄▄▄"
  8695. " ▌freopen▐   Asocia un nuevo fichero con un flujo abierto."
  8696. " ▀▀▀▀▀▀▀▀▀"
  8697. ""
  8698. " Sintaxis:"
  8699. "   FILE *freopen (const char *nombre_fichero, const char *modo, FILE *flujo);"
  8700. ""
  8701. "El flujo es cerrado. El fichero nombre_fichero es abierto y asociado con el"
  8702. "flujo. Devuelve flujo si tiene éxito o NULL si falló."
  8703. ""
  8704. "Ejemplo:"
  8705. ""
  8706. "  #include <stdio.h>"
  8707. ""
  8708. "  void main (void)"
  8709. "  {"
  8710. "    FILE *pf;"
  8711. ""
  8712. "    printf ("Esto se escribe en pantalla.\n");"
  8713. "    if ((pf = freopen ("salida.doc", "w", stdout)) == NULL)"
  8714. "      printf ("Error: No se puede abrir el fichero salida.doc\n");"
  8715. "    else"
  8716. "      printf ("Esto se escribe en el fichero salida.doc");"
  8717. "  }"
  8718. ""
  8719. ""
  8720. " ▄▄▄▄▄▄▄▄"
  8721. " ▌fscanf▐   Ejecuta entrada formateada de un flujo."
  8722. " ▀▀▀▀▀▀▀▀"
  8723. ""
  8724. " Sintaxis:"
  8725. "   int fscanf (FILE *flujo, const char *formato[, direccion, ...]);"
  8726. ""
  8727. "Esta función es idéntica a la función scanf() con la excepción que scanf()"
  8728. "lee de la entrada estándar (flujo stdin) y la función fscanf () lee de la"
  8729. "entrada especificada (flujo indicado en su primer argumento)."
  8730. ""
  8731. "Ejemplo:"
  8732. ""
  8733. "  /* supone que pf está asociado con"
  8734. "     un fichero de entrada */"
  8735. ""
  8736. "  int d;"
  8737. "  float f;"
  8738. "  fscanf (pf, "%d %f", &d, %f);"
  8739. ""
  8740. ""
  8741. " ▄▄▄▄▄▄▄"
  8742. " ▌fseek▐   Posiciona el puntero de fichero de un flujo."
  8743. " ▀▀▀▀▀▀▀"
  8744. ""
  8745. " Sintaxis:"
  8746. "   int fseek (FILE *flujo, long desplazamiento, int origen);"
  8747. ""
  8748. "La función fseek() sitúa el indicador de posición del fichero asociado a"
  8749. "flujo de acuerdo con los valores de desplazamiento y origen. Su objetivo"
  8750. "principal es soportar operaciones de E/S aleatorias; desplazamiento es"
  8751. "el número de bytes desde el origen elegido a la posición seleccionada. El"
  8752. "origen es 0, 1 ó 2 (0 es el principio del fichero, 1 es la posición actual"
  8753. "y 2 es el final del fichero). El estándar ANSI fija los siguientes nombres"
  8754. "para los orígenes:"
  8755. ""
  8756. "     Origen                 Nombre"
  8757. "     --------------------   --------"
  8758. "     Comienzo del fichero   SEEK_SET"
  8759. "     Posición actual        SEEK_CUR"
  8760. "     Final del fichero      SEEK_END"
  8761. ""
  8762. "Si se devuelve el valor 0, se supone que fseek() se ha ejecutado correc-"
  8763. "tamente. Un valor distinto de 0 indica fallo."
  8764. ""
  8765. "En la mayor parte de las implementaciones y en el estándar ANSI, despla-"
  8766. "zamiento debe ser un long int para soportar ficheros de más de 64K bytes."
  8767. ""
  8768. "Ejemplo:"
  8769. ""
  8770. "  #include <stdio.h>"
  8771. ""
  8772. "  long tamanio_fichero (FILE *flujo);"
  8773. ""
  8774. "  int main (void)"
  8775. "  {"
  8776. "     FILE *flujo;"
  8777. ""
  8778. "     flujo = fopen ("MIFICH.TXT", "w+");"
  8779. "     fprintf (flujo, "Esto es un test.");"
  8780. "     printf ("El tamaño del fichero MIFICH.TXT es %ld bytes,\n","
  8781. "             tamanio_fichero (flujo));"
  8782. "     fclose (flujo);"
  8783. "     return 0;"
  8784. "  }"
  8785. ""
  8786. "  long tamanio_fichero (FILE *flujo)"
  8787. "  {"
  8788. "     long posicion_corriente, longitud;"
  8789. ""
  8790. "     posicion_corriente = ftell (flujo);"
  8791. "     fseek (flujo, 0L, SEEK_END);"
  8792. "     longitud = ftell (flujo);"
  8793. "     fseek (flujo, posicion_corriente, SEEK_SET);"
  8794. "     return flujo;"
  8795. "  }"
  8796. ""
  8797. ""
  8798. " ▄▄▄▄▄▄▄"
  8799. " ▌ftell▐   Devuelve la posición actual del puntero de fichero."
  8800. " ▀▀▀▀▀▀▀"
  8801. ""
  8802. " Sintaxis:"
  8803. "   long ftell (FILE *flujo);"
  8804. ""
  8805. "Devuelve el valor actual del indicador de posición del fichero para el"
  8806. "flujo especificado si tiene éxito o -1L en caso de error."
  8807. ""
  8808. "Ejemplo:"
  8809. ""
  8810. "  /* ver ejemplo de la función fseek */"
  8811. ""
  8812. ""
  8813. " ▄▄▄▄▄▄▄▄"
  8814. " ▌fwrite▐   Escribe en un flujo."
  8815. " ▀▀▀▀▀▀▀▀"
  8816. ""
  8817. " Sintaxis:"
  8818. "   int fwrite (const void *buf, int tam, int n, FILE *flujo);"
  8819. ""
  8820. "Escribe n elementos de tam bytes cada uno. Devuelve el número de elementos"
  8821. "(no bytes) escritos realmente."
  8822. ""
  8823. "Ejemplo:"
  8824. ""
  8825. "  /* supone que pf está asociado con"
  8826. "     un fichero de salida */"
  8827. ""
  8828. "  float f = 1.2;"
  8829. ""
  8830. "  fwrite (&f, sizeof (float), 1, pf);"
  8831. ""
  8832. ""
  8833. " ▄▄▄▄▄▄"
  8834. " ▌getc▐   Macro que obtiene un carácter de un flujo."
  8835. " ▀▀▀▀▀▀"
  8836. ""
  8837. " Sintaxis:"
  8838. "   int getc (FILE *flujo);"
  8839. ""
  8840. "Devuelve el carácter leído en caso de éxito o EOF en caso de error o que"
  8841. "se detecte el fin de fichero."
  8842. ""
  8843. "Las funciones getc() y fgetc() son idénticas, y en la mayor parte de las"
  8844. "implementaciones getc() está definida por la siguiente macro:"
  8845. ""
  8846. "#define getc(pf) fgetc(pf)"
  8847. ""
  8848. "Ejemplo:"
  8849. ""
  8850. "  /* supone que pf está asociado"
  8851. "     con un fichero de entrada */"
  8852. ""
  8853. "  while ((ch = getc (pf)) != EOF)"
  8854. "    printf ("%c", ch);"
  8855. ""
  8856. ""
  8857. " ▄▄▄▄▄▄▄▄▄"
  8858. " ▌getchar▐   Macro que obtiene un carácer de stdin."
  8859. " ▀▀▀▀▀▀▀▀▀"
  8860. ""
  8861. " Sintaxis:"
  8862. "   int getchar (void);"
  8863. ""
  8864. "Si tiene éxito, getchar() devuelve el carácter leído, después de conver-"
  8865. "tirlo a int sin extensión de signo. En caso de fin de fichero o error,"
  8866. "devuelve EOF."
  8867. ""
  8868. "Las funciones getchar() y fgetchar() son idénticas, y en la mayor parte"
  8869. "de las implementaciones getchar() está simplemente definida como la"
  8870. "siguiente macro:"
  8871. ""
  8872. "#define getchar(pf) fgetchar(pf)"
  8873. ""
  8874. "Ejemplo:"
  8875. ""
  8876. "  ch = getchar ();"
  8877. ""
  8878. ""
  8879. " ▄▄▄▄▄▄"
  8880. " ▌gets▐   Obtiene una cadena de caracteres de stdin."
  8881. " ▀▀▀▀▀▀"
  8882. ""
  8883. " Sintaxis:"
  8884. "   char *gets (char *string);"
  8885. ""
  8886. "Lee caracteres de stdin hasta que un carácter de nueva línea (\n) es"
  8887. "encontrado. El carácter \n no es colocado en el string. Devuelve un"
  8888. "puntero al argumento string."
  8889. ""
  8890. "Ejemplo:"
  8891. ""
  8892. "  char nombre_fichero[128];"
  8893. ""
  8894. "  gets (nombre_fichero);"
  8895. ""
  8896. ""
  8897. " ▄▄▄▄▄▄▄▄"
  8898. " ▌perror▐   Mensajes de error del sistema."
  8899. " ▀▀▀▀▀▀▀▀"
  8900. ""
  8901. " Sintaxis:"
  8902. "   void perror (const char *s);"
  8903. ""
  8904. "Imprime un mensaje de error en stderr. Primero se imprime el argumento de"
  8905. "string s, después se escriben dos puntos, a continuación se escribe un"
  8906. "mensaje de error acorde al valor corriente de la variable errno, y por"
  8907. "último se escribe una nueva línea."
  8908. ""
  8909. "errno es una variable global que contiene el tipo de error. Siempre que"
  8910. "ocurre un error en una llamada al sistema, a errno se le asigna un valor"
  8911. "que indica el tipo de error."
  8912. begint
  8913. ""
  8914. "En Turbo C, la variable errno está declarada en los ficheros errno.h,"
  8915. "stddef.h y stdlib.h, siendo su declaración: int errno;"
  8916. "Los posibles valores que puede tomar esta variable no interesa en este"
  8917. "momento, así que se dirán cuáles son cuando se estudie la librería <errno.h>."
  8918. endt
  8919. ""
  8920. "Ejemplo:"
  8921. ""
  8922. "  /*"
  8923. "    Este programa imprime:"
  8924. "    «No es posible abir fichero para lectura: No such file or directory»"
  8925. "  */"
  8926. ""
  8927. "  #include <stdio.h>"
  8928. ""
  8929. "  int main (void)"
  8930. "  {"
  8931. "    FILE *fp;"
  8932. ""
  8933. "    fp = fopen ("perror.dat", "r");"
  8934. "    if (! fp)"
  8935. "      perror ("No es posible abir fichero para lectura");"
  8936. "    return 0;"
  8937. "  }"
  8938. ""
  8939. ""
  8940. " ▄▄▄▄▄▄▄▄"
  8941. " ▌printf▐   Escribe con formateo a stdout."
  8942. " ▀▀▀▀▀▀▀▀"
  8943. ""
  8944. " Sintaxis:"
  8945. "   int printf (const char *formato [, argumento, ...]);"
  8946. ""
  8947. "Esta función se explicó completamente en la lección 4."
  8948. ""
  8949. ""
  8950. " ▄▄▄▄▄▄"
  8951. " ▌putc▐   Escribe un carácter en un flujo."
  8952. " ▀▀▀▀▀▀"
  8953. ""
  8954. " Sintaxis:"
  8955. "   int putc (int c, FILE *flujo);"
  8956. ""
  8957. "Si tiene éxito, putc() devuelve el carácter c. En caso de error, devuelve"
  8958. "EOF."
  8959. ""
  8960. "Una de las funciones putc() y fputc() se implementa como macro de la otra."
  8961. "Las dos son funcionalmente equivalentes."
  8962. ""
  8963. "Ejemplo:"
  8964. ""
  8965. "  /* supone que pf está asociado con"
  8966. "     un fichero de salida */"
  8967. ""
  8968. "  putc ('a', pf);"
  8969. ""
  8970. ""
  8971. " ▄▄▄▄▄▄▄▄▄"
  8972. " ▌putchar▐   Escribe un carácter en stdout."
  8973. " ▀▀▀▀▀▀▀▀▀"
  8974. ""
  8975. " Sintaxis:"
  8976. "   int putchar (int c);"
  8977. ""
  8978. "Si tiene éxito, putc() devuelve el carácter c. En caso de error, devuelve"
  8979. "EOF."
  8980. ""
  8981. "Una de las funciones putchar() y fputchar() se implementa como macro de la"
  8982. "otra. Las dos son funcionalmente equivalentes."
  8983. ""
  8984. "Ejemplo:"
  8985. ""
  8986. "  /* supone que pf está asociado con"
  8987. "     un fichero de salida */"
  8988. ""
  8989. "  putchar ('a');"
  8990. ""
  8991. ""
  8992. " ▄▄▄▄▄▄"
  8993. " ▌puts▐   Escribe un string en stdout (y añade un carácter de nueva línea)."
  8994. " ▀▀▀▀▀▀"
  8995. ""
  8996. " Sintaxis:"
  8997. "   int puts (const char *s);"
  8998. ""
  8999. "Si la escritura tiene éxito, puts() devuelve el último carácter escrito. En"
  9000. "otro caso, devuelve EOF."
  9001. ""
  9002. "Esta función se discutió completamente en la lección 4."
  9003. ""
  9004. ""
  9005. " ▄▄▄▄▄▄▄▄"
  9006. " ▌remove▐   Función que borra un fichero."
  9007. " ▀▀▀▀▀▀▀▀"
  9008. ""
  9009. " Sintaxis:"
  9010. "   int remove (const char *nombre_fichero);"
  9011. ""
  9012. "La función remove() borra el fichero especificado por nombre_fichero."
  9013. "Devuelve 0 si el fichero ha sido correctamente borrado y -1 si se ha"
  9014. "producido un error."
  9015. ""
  9016. "Ejemplo:"
  9017. ""
  9018. "  #include <stdio.h>"
  9019. ""
  9020. "  int main (void)"
  9021. "  {"
  9022. "    char fichero[80];"
  9023. ""
  9024. "    printf ("Fichero para borrar: ");"
  9025. "    gets (fichero);"
  9026. ""
  9027. "    if (remove (fichero) == 0)"
  9028. "      printf ("Fichero %s borrado.\n", fichero);"
  9029. "    else"
  9030. "      printf ("No se ha podido borrar el fichero %s.\n", fichero);"
  9031. ""
  9032. "    return 0;"
  9033. "  }"
  9034. ""
  9035. ""
  9036. " ▄▄▄▄▄▄▄▄"
  9037. " ▌rename▐   Renombra un fichero."
  9038. " ▀▀▀▀▀▀▀▀"
  9039. ""
  9040. " Sintaxis:"
  9041. "   int rename (const char *viejo_nombre, const char *nuevo_nombre);"
  9042. ""
  9043. "La función rename() cambia el nombre del fichero especificado por"
  9044. "viejo_nombre a nuevo_nombre. El nuevo_nombre no debe estar asociado"
  9045. "a ningún otro en el directorio de entrada. La función rename()"
  9046. "devuelve 0 si tiene éxito y un valor no nulo si se produce un error."
  9047. ""
  9048. "Ejemplo:"
  9049. ""
  9050. "  #include <stdio.h>"
  9051. ""
  9052. "  int main (void)"
  9053. "  {"
  9054. "    char viejo_nombre[80], nuevo_nombre[80];"
  9055. ""
  9056. "    printf ("Fichero a renombrar: ");"
  9057. "    gets (viejo_nombre);"
  9058. "    printf ("Nuevo nombre: ");"
  9059. "    gets (nuevo_nombre);"
  9060. ""
  9061. "    if (rename (viejo_nombre, nuevo_nombre) == 0)"
  9062. "      printf ("Fichero %s renombrado a %s.\n", viejo_nombre, nuevo_nombre);"
  9063. "    else"
  9064. "      printf ("No se ha podido renombrar el fichero %s.\n", viejo_nombre);"
  9065. ""
  9066. "    return 0;"
  9067. "  }"
  9068. ""
  9069. ""
  9070. " ▄▄▄▄▄▄▄▄"
  9071. " ▌rewind▐   Reposiciona el puntero de fichero al comienzo del flujo."
  9072. " ▀▀▀▀▀▀▀▀"
  9073. ""
  9074. "Sintaxis:"
  9075. "  void rewind (FILE *flujo);"
  9076. ""
  9077. "La función rewind() mueve el indicador de posición del fichero al"
  9078. "principio del flujo especificado. También inicializa los indicadores"
  9079. "de error y fin de fichero asociados con flujo. No devuelve valor."
  9080. ""
  9081. "Ejemplo:"
  9082. ""
  9083. "  void releer (FILE *pf)"
  9084. "  {"
  9085. "    /* lee una vez */"
  9086. "    while (! feof (pf))"
  9087. "      putchar (getc (pf));"
  9088. ""
  9089. "    rewind (pf);"
  9090. ""
  9091. "    /* leer otra vez */"
  9092. "    while (! feof (pf))"
  9093. "      putchar (getc (pf));"
  9094. "  }"
  9095. ""
  9096. ""
  9097. " ▄▄▄▄▄▄▄"
  9098. " ▌scanf▐  Ejecuta entrada formateada de stdin."
  9099. " ▀▀▀▀▀▀▀"
  9100. ""
  9101. " Sintaxis:"
  9102. "   int scanf (const char *formato [, ...]);"
  9103. ""
  9104. "Esta función se explicó completamente en la lección 4."
  9105. ""
  9106. ""
  9107. " ▄▄▄▄▄▄▄▄"
  9108. " ▌setbuf▐   Asigna un buffer a un flujo."
  9109. " ▀▀▀▀▀▀▀▀"
  9110. ""
  9111. " Sintaxis:"
  9112. "   void setbuf (FILE *flujo, char *buf);"
  9113. ""
  9114. "La función setbuf() se utiliza para determinar el buffer del flujo"
  9115. "especificado que se utilizará o -si se llama con buf a nulo- para"
  9116. "desactivar el buffer. Si un buffer va a ser definido por el progra-"
  9117. "mador, entonces debe ser de BUFSIZ caracteres. BUFSIZ está definido"
  9118. "en stdio.h. La función setbuf() no devuelve valor."
  9119. ""
  9120. "Ejemplo:"
  9121. ""
  9122. "  #include <stdio.h>"
  9123. ""
  9124. "  /* BUFSIZ está definido en stdio.h */"
  9125. "  char outbuf[BUFSIZ];"
  9126. ""
  9127. "  int main (void)"
  9128. "  {"
  9129. "    /* añade un buffer al flujo de salida estándar */"
  9130. "    setbuf (stdout, outbuf);"
  9131. ""
  9132. "    /* pone algunos caracteres dentro del buffer */"
  9133. "    puts ("Esto es un test de salida con buffer.\n\n");"
  9134. "    puts ("Esta salida irá a outbuf\n");"
  9135. "    puts ("y no aparecerá hasta que el buffer\n");"
  9136. "    puts ("esté lleno o volquemos el flujo.\n");"
  9137. ""
  9138. "    /* vuelca el buffer de salida */"
  9139. "    fflush (stdout);"
  9140. ""
  9141. "    return 0;"
  9142. "  }"
  9143. ""
  9144. ""
  9145. " ▄▄▄▄▄▄▄▄▄"
  9146. " ▌setvbuf▐   Asigna un buffer a un flujo."
  9147. " ▀▀▀▀▀▀▀▀▀"
  9148. ""
  9149. " Sintaxis:"
  9150. "   int setvbuf (FILE *flujo, char *buf, int tipo, int tam);"
  9151. ""
  9152. "La función setvbuf() permite al programador especificar el buffer, su"
  9153. "tamaño y su modo para el flujo especificado. El array de caracteres"
  9154. "apuntado por buf se utiliza como buffer de flujo para las operaciones"
  9155. "de E/S. El tamaño del buffer está fijado por tam, y tipo determina"
  9156. "como se usará. Si buf es nulo, no tiene lugar ninguna operación sobre"
  9157. "el buffer."
  9158. ""
  9159. "Los valores legales de tipo son _IOFBF, _IONBF y _IOLBF. Están definidos"
  9160. "en stdio.h. Cuando se activa el modo _IOFBF se produce una operación de"
  9161. "buffer completa. Este es el modo por defecto. Cuando se activa _IONBF, el"
  9162. "flujo no utiliza buffer independientemente del valor de buf. Si el modo"
  9163. "es _IOLBF, el flujo utiliza buffer por líneas, lo que supone que el buffer"
  9164. "es volcado en el fichero cada vez que se escribe un carácter de salto de"
  9165. "línea para los flujos de salida; para los flujos de entrada lee todos los"
  9166. "caracteres hasta un carácter de salto de línea. En cualquier caso, el"
  9167. "buffer es volcado en el fichero cuando se llena."
  9168. ""
  9169. "El valor de tam debe ser mayor que 0. La función setvbuf() devuelve 0 en"
  9170. "caso de éxito; en caso de fallo devuelve un valor distinto de cero."
  9171. ""
  9172. "Ejemplo:"
  9173. ""
  9174. "  setvbuf (pf, buffer, _IOLBF, 128);"
  9175. ""
  9176. ""
  9177. " ▄▄▄▄▄▄▄▄▄"
  9178. " ▌sprintf▐   Envía salida formateada a un string."
  9179. " ▀▀▀▀▀▀▀▀▀"
  9180. ""
  9181. " Sintaxis:"
  9182. "   int sprintf (char *buffer, const char *formato [, argumento, ...]);"
  9183. ""
  9184. ""
  9185. "Esta función es igual que la función printf() con la diferencia de que la"
  9186. "salida de la función printf() va al flujo stdout y la salida de la función"
  9187. "sprintf() va al string buffer."
  9188. ""
  9189. "Devuelve el número de bytes escritos. En caso de error, sprintf() devuelve"
  9190. "EOF."
  9191. ""
  9192. "Ejemplo:"
  9193. ""
  9194. "  char cadena[80];"
  9195. "  sprintf (cadena, "%s %d %c", "abc", 5, 'd');"
  9196. ""
  9197. ""
  9198. " ▄▄▄▄▄▄▄▄"
  9199. " ▌sscanf▐   Ejecuta entrada formateada de string."
  9200. " ▀▀▀▀▀▀▀▀"
  9201. ""
  9202. " Sintaxis:"
  9203. "   int sscanf (const char *buffer, const char *formato [, direccion, ...]);"
  9204. ""
  9205. "Esta función es igual que la función scanf() con la diferencia de que la"
  9206. "entrada de la función scanf() se coge del flujo stdin y la entrada de la"
  9207. "función sscanf() se coge del string buffer."
  9208. ""
  9209. "Devuelve el número de bytes escritos. En caso de error, sprintf() devuelve"
  9210. "EOF."
  9211. "Devuelve el número de campos leídos, explorados, convertidos y almacenados"
  9212. "con éxito. Si sscanf intenta leer más allá del final de buffer, entonces"
  9213. "el valor devuelto es EOF."
  9214. ""
  9215. "Ejemplo:"
  9216. ""
  9217. "  char cadena[80];"
  9218. "  int i;"
  9219. "  sscanf ("abc 6", "%s%d", cadena, &i);"
  9220. ""
  9221. ""
  9222. " ▄▄▄▄▄▄▄▄▄"
  9223. " ▌tmpfile▐   Abre un fichero temporal en modo binario."
  9224. " ▀▀▀▀▀▀▀▀▀"
  9225. ""
  9226. " Sintaxis:"
  9227. "   FILE *tmpfile (void);"
  9228. ""
  9229. "La función tmpfile() abre un fichero temporal para actualizarlo y devuelve"
  9230. "un puntero a un flujo. La función utiliza automáticamente un único nombre"
  9231. "de fichero para evitar conflictos con los ficheros existentes. La función"
  9232. "devuelve un puntero nulo en caso de fallo; en cualquier otro caso devuelve"
  9233. "un puntero a un flujo."
  9234. ""
  9235. "El fichero temporal creado por tmpfile() se elimina automáticamente"
  9236. "cuando el fichero es cerrado o cuando el programa termina."
  9237. ""
  9238. "Ejemplo:"
  9239. ""
  9240. "  FILE *pftemp;"
  9241. ""
  9242. "  if ((pftemp = tmpfile ()) == NULL)"
  9243. "    {"
  9244. "      printf ("No se puede abrir el fichero de trabajo temporal.\n");"
  9245. "      exit (1);"
  9246. "    }"
  9247. ""
  9248. ""
  9249. " ▄▄▄▄▄▄▄▄"
  9250. " ▌tmpnam▐   Crea un nombre de fichero único."
  9251. " ▀▀▀▀▀▀▀▀"
  9252. ""
  9253. " Sintaxis:"
  9254. "   char *tmpnam (char *nombre_fichero);"
  9255. ""
  9256. "La función tmpnam() genera un único nombre de fichero y lo guarda en el"
  9257. "array apuntado por nombre. El objetivo de tmpnam() es generar el nombre"
  9258. "de un fichero temporal que sea diferente de cualquier otro que exista"
  9259. "en el directorio."
  9260. ""
  9261. "La función puede ser llamada hasta un número de veces igual a TMP_MAX,"
  9262. "que está definido en stdio.h. Cada vez se genera un nuevo nombre de"
  9263. "fichero temporal."
  9264. ""
  9265. "En caso de éxito se devuelve un puntero a una cadena de caracteres; en"
  9266. "cualquier otro caso se devuelve un puntero nulo."
  9267. ""
  9268. "Ejemplo:"
  9269. ""
  9270. "  #include <stdio.h>"
  9271. ""
  9272. "  int main (void)"
  9273. "  {"
  9274. "    char nombre[13];"
  9275. ""
  9276. "    tmpnam (nombre);"
  9277. "    printf ("Nombre temporal: %s\n", nombre);"
  9278. "    return 0;"
  9279. "  }"
  9280. ""
  9281. ""
  9282. " ▄▄▄▄▄▄▄▄"
  9283. " ▌ungetc▐   Devuelve un carácter al flujo de entrada."
  9284. " ▀▀▀▀▀▀▀▀"
  9285. ""
  9286. " Sintaxis:"
  9287. "   int ungetc (int c, FILE *flujo);"
  9288. ""
  9289. " Prototype in:"
  9290. " stdio.h"
  9291. ""
  9292. "La próxima llamada a getc (u otras funciones de entrada de flujos) para"
  9293. "flujo devolverá c."
  9294. ""
  9295. "La función ungetc() devuelve el carácter c si tiene éxito. Devuelve EOF"
  9296. "si la operación falla."
  9297. ""
  9298. "Ejemplo:"
  9299. ""
  9300. "  ungetc ('a', stdin);"
  9301. "  ch = getc (stdin); /* a ch se le asigna el carácter 'a' */"
  9302. ""
  9303. ""
  9304. " ▄▄▄▄▄▄▄▄▄▄"
  9305. " ▌vfprintf▐   Envía salida formateada a un flujo usando una lista de"
  9306. " ▀▀▀▀▀▀▀▀▀▀   argumentos."
  9307. ""
  9308. " Sintaxis:"
  9309. "   int vfprintf (FILE *fp, const char *formato, va_list lista_de_arg);"
  9310. ""
  9311. "Devuelve el número de bytes escritos. En caso de error, devuelve EOF."
  9312. ""
  9313. ""
  9314. " ▄▄▄▄▄▄▄▄▄"
  9315. " ▌vfscanf▐   Ejecuta entrada formateada de un flujo usando una lista de"
  9316. " ▀▀▀▀▀▀▀▀▀   argumentos."
  9317. ""
  9318. " Sintaxis:"
  9319. "   int vfscanf (FILE *flujo, const char *formato, va_list lista_de_arg);"
  9320. ""
  9321. "Devuelve el número de campos leídos, explorados, convertidos y almacenados"
  9322. "con éxito."
  9323. ""
  9324. ""
  9325. " ▄▄▄▄▄▄▄▄▄"
  9326. " ▌vprintf▐   Envía salida formateada a stdout usando una lista de"
  9327. " ▀▀▀▀▀▀▀▀▀   argumentos."
  9328. ""
  9329. " Sintaxis:"
  9330. "   int vprintf (const char *formato, va_list lista_de_arg);"
  9331. ""
  9332. "Devuelve el número de bytes escritos. En caso de error, devuelve EOF."
  9333. ""
  9334. ""
  9335. " ▄▄▄▄▄▄▄▄"
  9336. " ▌vscanf▐   Ejecuta entrada formateada de stdin usando una lista de"
  9337. " ▀▀▀▀▀▀▀▀   argumentos."
  9338. ""
  9339. " Sintaxis:"
  9340. "   int vscanf (const char *formato, va_list lista_de_arg);"
  9341. ""
  9342. "Devuelve el número de campos leídos, explorados, convertidos y almacenados"
  9343. "con éxito. Devuelve EOF en caso de que se detecte el fin de fichero."
  9344. ""
  9345. ""
  9346. " ▄▄▄▄▄▄▄▄▄▄"
  9347. " ▌vsprintf▐   Envía salida formateada a un string usando una lista de"
  9348. " ▀▀▀▀▀▀▀▀▀▀   argumentos."
  9349. ""
  9350. " Sintaxis:"
  9351. "   int vsprintf (char *buffer, const char *formato, va_list lista_de_arg);"
  9352. ""
  9353. "Devuelve el número de bytes escritos. En caso de error, devuelve EOF."
  9354. ""
  9355. ""
  9356. " ▄▄▄▄▄▄▄▄▄"
  9357. " ▌vsscanf▐   Ejecuta entrada formateada de un string usando una lista de"
  9358. " ▀▀▀▀▀▀▀▀▀   argumentos."
  9359. ""
  9360. " Sintaxis:"
  9361. "   int vsscanf (const char *buffer, const char *formato, va_list lista_arg);"
  9362. ""
  9363. "Devuelve el número de campos leídos, explorados, convertidos y almacenados"
  9364. "con éxito. Devuelve EOF en caso de que se detecte el fin de fichero."
  9365. ""
  9366. "Las funciones vprintf(), vfprintf() y vsprintf() son funciones equivalentes"
  9367. "a printf(), fprintf() y sprintf() respectivamente."
  9368. "Las funciones vscanf(), vfscanf() y vsscanf() son funciones equivalentes"
  9369. "a scanf(), fscanf() y sscanf() respectivamente."
  9370. "La diferencia se encuentra en que la lista de argumentos se sustituye por"
  9371. "un puntero a una lista de argumentos. Este puntero está definido en stdarg.h."
  9372. "Consulta la discusión del fichero stdarg.h en la lección 5 para tener más"
  9373. "detalles y ver un ejemplo."
  9374. ""
  9375. endvis
  9376. begint
  9377. beginvis
  9378. no_multiatributo
  9379. no_posicion
  9380. cabecera " FUNCIONES AÑADIDAS POR TURBO C AL ANSI EN FICHERO DE CABECERA STDIO.H "
  9381. coordenadas_completas 1 2 80 24
  9382. color 0 3
  9383. borde 2
  9384. "GLOSARIO:"
  9385. ""
  9386. " ▄▄▄▄▄▄▄▄▄▄ "
  9387. " ▌clearerr▐   Borra indicación de error."
  9388. " ▀▀▀▀▀▀▀▀▀▀ "
  9389. " ▄▄▄▄▄▄▄▄▄▄▄"
  9390. " ▌fcloseall▐   Cierra todos los flujos abiertos."
  9391. " ▀▀▀▀▀▀▀▀▀▀▀"
  9392. " ▄▄▄▄▄▄▄▄"
  9393. " ▌fdopen▐   Asocia un flujo con un descriptor de fichero."
  9394. " ▀▀▀▀▀▀▀▀"
  9395. " ▄▄▄▄▄▄▄▄▄"
  9396. " ▌fgetpos▐   Obtiene la posición actual del puntero de fichero."
  9397. " ▀▀▀▀▀▀▀▀▀"
  9398. " ▄▄▄▄▄▄▄▄"
  9399. " ▌fileno▐  Macro que devuelve el descriptor de fichero asociado con un flujo."
  9400. " ▀▀▀▀▀▀▀▀"
  9401. " ▄▄▄▄▄▄▄▄▄▄"
  9402. " ▌flushall▐   Vuelca todos los flujos abiertos."
  9403. " ▀▀▀▀▀▀▀▀▀▀"
  9404. " ▄▄▄▄▄▄▄▄▄"
  9405. " ▌fsetpos▐   Posiciona el puntero de fichero de un flujo."
  9406. " ▀▀▀▀▀▀▀▀▀"
  9407. " ▄▄▄▄▄▄"
  9408. " ▌getw▐   Obtiene un entero de un flujo."
  9409. " ▀▀▀▀▀▀"
  9410. " ▄▄▄▄▄▄"
  9411. " ▌putw▐   Escribe un entero en un flujo."
  9412. " ▀▀▀▀▀▀"
  9413. ""
  9414. ""
  9415. "ESTUDIO DE LAS FUNCIONES EXPUESTAS EN EL GLOSARIO:"
  9416. ""
  9417. " ▄▄▄▄▄▄▄▄▄▄ "
  9418. " ▌clearerr▐   Borra indicación de error."
  9419. " ▀▀▀▀▀▀▀▀▀▀ "
  9420. ""
  9421. " Sintaxis:"
  9422. "   void clearerr (FILE *flujo);"
  9423. ""
  9424. "La función clearerr() borra los indicadores de error y fin de fichero"
  9425. "para el flujo especificado."
  9426. ""
  9427. "Ejemplo:"
  9428. ""
  9429. "  #include <stdio.h>"
  9430. ""
  9431. "  int main (void)"
  9432. "  {"
  9433. "    FILE *fp;"
  9434. "    char ch;"
  9435. ""
  9436. "    /* abre un fichero para escritura */"
  9437. "    fp = fopen ("PRUEBA.TXT", "w");"
  9438. ""
  9439. "    /* fuerza una condición de error al intentar leer */"
  9440. "    ch = fgetc (fp);"
  9441. "    printf ("%c\n",ch);"
  9442. ""
  9443. "    if (ferror( fp))"
  9444. "      {"
  9445. "        /* visualiza un mensaje de error */"
  9446. "        printf ("Error leyendo de PRUEBA.TXT\n");"
  9447. ""
  9448. "        /* borra los indicadores de error y EOF */"
  9449. "        clearerr (fp);"
  9450. "      }"
  9451. ""
  9452. "    fclose (fp);"
  9453. "    return 0;"
  9454. "  }"
  9455. ""
  9456. ""
  9457. " ▄▄▄▄▄▄▄▄▄▄▄"
  9458. " ▌fcloseall▐   Cierra todos los flujos abiertos."
  9459. " ▀▀▀▀▀▀▀▀▀▀▀"
  9460. ""
  9461. " Sintaxis:"
  9462. "   int fcloseall (void);"
  9463. ""
  9464. "Devuelve el número total de flujos cerrados, o EOF si fue detectado algún"
  9465. "error."
  9466. ""
  9467. "Ejemplo:"
  9468. ""
  9469. "  #include <stdio.h>"
  9470. ""
  9471. "  int main (void)"
  9472. "  {"
  9473. "    int flujos_cerrados;"
  9474. ""
  9475. "    /* abre dos flujos */"
  9476. "    fopen ("FICHERO1", "w");"
  9477. "    fopen ("FICHERO2", "w");"
  9478. ""
  9479. "    /* cierra los flujos abiertos */"
  9480. "    flujos_cerrados = fcloseall ();"
  9481. ""
  9482. "    if (flujos_cerrados == EOF)"
  9483. "      /* imprime un mensaje de error */"
  9484. "      printf ("Ha ocurrido un error al intentar cerrar los ficheros.\n");"
  9485. "    else"
  9486. "       /* imprime resultado de la función fcloseall(): */"
  9487. "       printf("%d flujos fueron cerrados.\n", flujos_cerrados);"
  9488. ""
  9489. "    return 0;"
  9490. "  }"
  9491. ""
  9492. ""
  9493. " ▄▄▄▄▄▄▄▄"
  9494. " ▌fdopen▐   Asocia un flujo con un descriptor de fichero."
  9495. " ▀▀▀▀▀▀▀▀"
  9496. ""
  9497. " Sintaxis:"
  9498. "   FILE *fdopen (int descriptor, char *tipo);"
  9499. ""
  9500. "Devuelve un puntero al nuevo flujo abierto o NULL en el caso de un error."
  9501. ""
  9502. "Los valores posibles del argumento tipo son los mismos que para los de"
  9503. "la función fopen(). Consiste en un string con una combinación de los"
  9504. "siguientes caracteres:"
  9505. ""
  9506. "   Tipo │ Significado"
  9507. "  ══════╪════════════════════════════════════════════════════════════════"
  9508. "    r   │ Abre para lectura solamente"
  9509. "    w   │ Crea para escritura; sobreescribe fichero existente"
  9510. "    a   │ Añade, abre para escritura al final del fichero, o crea"
  9511. "        │ fichero para escritura"
  9512. "    +   │ Símbolo de suma para permitir operaciones de lectura/escritura"
  9513. "    b   │ Abre en modo binario"
  9514. "    t   │ Abre en modo texto"
  9515. ""
  9516. "Las funciones de stdio.h: fileno() y fdopen(), utilizan el concepto de"
  9517. "descriptor de fichero; este concepto se explica en las ventanas inme-"
  9518. "diatamente siguientes."
  9519. ""
  9520. ""
  9521. " ▄▄▄▄▄▄▄▄▄"
  9522. " ▌fgetpos▐   Obtiene la posición actual del puntero de fichero."
  9523. " ▀▀▀▀▀▀▀▀▀"
  9524. ""
  9525. " Sintaxis:"
  9526. "   int fgetpos (FILE *flujo, fpos_t *pos);"
  9527. ""
  9528. "La posición almacenada en *pos puede ser pasada a la función fsetpos()"
  9529. "para poner la posición del puntero de fichero."
  9530. ""
  9531. "Devuelve 0 en caso de éxito y un valor distinto de cero en otro caso."
  9532. ""
  9533. "fpos_t es un tipo declarado con typdef en el fichero stdio.h que indica"
  9534. "posición de fichero."
  9535. ""
  9536. "Ejemplo:"
  9537. ""
  9538. "  #include <string.h> /* strlen() devuelve la longitud de un string */"
  9539. "  #include <stdio.h> /* para utilizar: FILE, fpos_t, fopen (), fwrite (),"
  9540. "                        fgetpos (), printf () y fclose () */"
  9541. ""
  9542. "  int main (void)"
  9543. "  {"
  9544. "    FILE *flujo;"
  9545. "    char string[] = "Esto es un test";"
  9546. "    fpos_t posfich;"
  9547. ""
  9548. "    /* abre un fichero para actualizarlo */"
  9549. "    flujo = fopen ("FICHERO", "w+");"
  9550. ""
  9551. "    /* escribe un string en el fichero */"
  9552. "    fwrite (string, strlen (string), 1, flujo);"
  9553. ""
  9554. "    /* informa de la posición del puntero de fichero */"
  9555. "    fgetpos (flujo, &posfich);"
  9556. "    printf ("El puntero de fichero está en el byte %ld\n", posfich);"
  9557. ""
  9558. "    fclose (flujo);"
  9559. "    return 0;"
  9560. "  }"
  9561. ""
  9562. ""
  9563. " ▄▄▄▄▄▄▄▄"
  9564. " ▌fileno▐  Macro que devuelve el descriptor de fichero asociado con un flujo."
  9565. " ▀▀▀▀▀▀▀▀"
  9566. ""
  9567. "Sintaxis:"
  9568. "  int fileno (FILE *flujo);"
  9569. ""
  9570. "Las funciones de stdio.h: fileno() y fdopen(), utilizan el concepto de"
  9571. "descriptor de fichero; este concepto se explica en las ventanas inme-"
  9572. "diatamente siguientes."
  9573. ""
  9574. ""
  9575. " ▄▄▄▄▄▄▄▄▄▄"
  9576. " ▌flushall▐   Vuelca todos los flujos abiertos."
  9577. " ▀▀▀▀▀▀▀▀▀▀"
  9578. ""
  9579. " Sintaxis:"
  9580. "   int flushall (void);"
  9581. ""
  9582. "Vacía los buffers para los flujos de entradas y escribe los buffers en"
  9583. "los ficheros para los flujos de salida."
  9584. ""
  9585. "Devuelve un entero que es el número de flujos abiertos de entrada y salida."
  9586. ""
  9587. "Ejemplo:"
  9588. ""
  9589. "  #include <stdio.h>"
  9590. ""
  9591. "  int main (void)"
  9592. "  {"
  9593. "    FILE *flujo;"
  9594. ""
  9595. "    /* crea un fichero */"
  9596. "    flujo = fopen ("FICHERO", "w");"
  9597. ""
  9598. "    /* vuelca todos los flujos abiertos */"
  9599. "    printf ("%d flujos fueron volcados.\n", flushall());"
  9600. ""
  9601. "    /* cierra el fichero */"
  9602. "    fclose (flujo);"
  9603. "    return 0;"
  9604. "  }"
  9605. ""
  9606. ""
  9607. " ▄▄▄▄▄▄▄▄▄"
  9608. " ▌fsetpos▐   Posiciona el puntero de fichero de un flujo."
  9609. " ▀▀▀▀▀▀▀▀▀"
  9610. ""
  9611. " Sintaxis:"
  9612. "   int fsetpos (FILE *flujo, const fpos_t *pos);"
  9613. ""
  9614. "La nueva posición apuntada por pos es el valor obtenido por una llamada"
  9615. "previa a la función fgetpos()."
  9616. ""
  9617. "En caso de éxito, devuelve 0. En caso de fallo, devuelve un valor distinto"
  9618. "de 0."
  9619. ""
  9620. "fpos_t es un tipo declarado con typdef en el fichero stdio.h que indica"
  9621. "posición de fichero."
  9622. ""
  9623. "Ejemplo:"
  9624. ""
  9625. "  #include <stdlib.h>"
  9626. "  #include <stdio.h>"
  9627. ""
  9628. "  void mostrar_posicion (FILE *flujo);"
  9629. ""
  9630. "  int main (void)"
  9631. "  {"
  9632. "    FILE *flujo;"
  9633. "    fpos_t posicion_fichero;"
  9634. ""
  9635. "    /* abre un fichero para actualización */"
  9636. "    flujo = fopen ("FICHERO", "w+");"
  9637. ""
  9638. "    /* salva la posición del puntero de fichero */"
  9639. "    fgetpos (flujo, &posicion_fichero);"
  9640. ""
  9641. "    /* escribe algunos datos en el fichero */"
  9642. "    fprintf (flujo, "Esto es una prueba");"
  9643. ""
  9644. "    /* muestra la posición corriente en fichero */"
  9645. "    mostrar_posicion (flujo);"
  9646. ""
  9647. "    /* pone una nueva posición de fichero, la visualiza */"
  9648. "    if (fsetpos (flujo, &posicion_fichero) == 0)"
  9649. "      mostrar_posicion (flujo);"
  9650. "    else"
  9651. "      {"
  9652. "        fprintf (stderr, "Error poniendo puntero de fichero.\n");"
  9653. "        exit (1);"
  9654. "      }"
  9655. ""
  9656. "    /* cierra el fichero */"
  9657. "    fclose (flujo);"
  9658. "    return 0;"
  9659. "  }"
  9660. ""
  9661. "  void mostrar_posicion (FILE *flujo)"
  9662. "  {"
  9663. "    fpos_t pos;"
  9664. ""
  9665. "    /* visualiza la posición actual del puntero de fichero de un flujo */"
  9666. "    fgetpos (flujo, &pos);"
  9667. "    printf ("Posición de fichero: %ld\n", pos);"
  9668. "  }"
  9669. ""
  9670. ""
  9671. " ▄▄▄▄▄▄"
  9672. " ▌getw▐   Obtiene un entero de un flujo."
  9673. " ▀▀▀▀▀▀"
  9674. ""
  9675. " Sintaxis:"
  9676. "   int getw (FILE *flujo);"
  9677. ""
  9678. "Devuelve el próximo entero en el flujo de entrada, o EOF si ocurre un error"
  9679. "o se detecta el fin de fichero. Usa las funciones feof() o ferror() para"
  9680. "verificar eof o error."
  9681. ""
  9682. "Ejemplo:"
  9683. ""
  9684. "  int entero = getw (pf);"
  9685. ""
  9686. ""
  9687. " ▄▄▄▄▄▄"
  9688. " ▌putw▐   Escribe un entero en un flujo."
  9689. " ▀▀▀▀▀▀"
  9690. ""
  9691. " Sintaxis:"
  9692. "   int putw (int d, FILE *flujo);"
  9693. ""
  9694. "Devuelve el entero d. En caso de error, devuelve EOF."
  9695. ""
  9696. "Ejemplo:"
  9697. ""
  9698. "  putw (10, pf);"
  9699. ""
  9700. endvis
  9701. endt
  9702. beginv
  9703. cabecera " SISTEMA DE FICHEROS TIPO UNIX "
  9704. centrar_coordenadas
  9705. borde 2
  9706. color 14 7
  9707. ""
  9708. " Debido a que el lenguaje C se desarrolló inicialmente bajo el"
  9709. " sistema operativo UNIX, se creó un segundo sistema de ficheros."
  9710. " A este sistema se le llama E/S sin buffer, E/S de bajo nivel o"
  9711. " E/S tipo UNIX. Hoy en día, este sistema de ficheros está total-"
  9712. " mente en desuso y se considera obsoleto, además el nuevo están- "
  9713. " dar ANSI ha decidido no estandarizar el sistema de E/S sin buf-"
  9714. " fer tipo UNIX. Por todo lo dicho no se puede recomendar este"
  9715. " sistema a los nuevos programadores C. Sin embargo, todavía"
  9716. " existen programas que lo usan y es soportado por la mayoría"
  9717. " de los compiladores de C. Así que incluimos una breve expli-"
  9718. " cación al respecto."
  9719. ""
  9720. endv
  9721. beginv
  9722. cabecera " DESCRIPTORES DE FICHEROS "
  9723. centrar_coordenadas
  9724. color 14 3
  9725. ""
  9726. " A diferencia del sistema de E/S de alto nivel,"
  9727. " el sistema de bajo nivel no utiliza punteros a"
  9728. " ficheros de tipo FILE; el sistema de bajo nivel "
  9729. " utiliza descriptores de fichero de tipo int. A"
  9730. " cada fichero se le asocia un número (su des-"
  9731. " criptor de fichero)."
  9732. ""
  9733. " Hay tres descriptores de fichero predefinidos:"
  9734. ""
  9735. "   0   entrada estándar"
  9736. "   1   salida estándar"
  9737. "   2   salida de errores estándar"
  9738. ""
  9739. endv
  9740. beginv
  9741. centrar_coordenadas
  9742. color 15 3
  9743. "Los cuatro pasos para la manipulación de ficheros con E/S de alto nivel que"
  9744. "vimos antes se transforman en la E/S de bajo nivel en los siguientes pasos:"
  9745. ""
  9746. "1) Declarar un descriptor de fichero para el fichero a abrir."
  9747. "  ~int fd;~"
  9748. "2) Abrir el fichero."
  9749. "  ~if ((fd = open (nombre_fichero, modo_apertura)) = -1)~"
  9750. "  ~  {                                                  ~"
  9751. "  ~    printf ("Error al intentar abrir el fichero.\n");~"
  9752. "  ~    exit (1);                                        ~"
  9753. "  ~  }                                                  ~"
  9754. "3) Manipular el fichero con las funciones que tenemos disponible para ello."
  9755. "4) Cerrar el fichero."
  9756. "  ~close (fd);~"
  9757. ""
  9758. "Tanto las funciones open() como close() como todas las que tenemos disponi-"
  9759. "bles con relación al sistema de ficheros de bajo nivel se explican en la"
  9760. "siguiente ventana, pero sólo para aquellos usuarios que tengan la opción de"
  9761. "turbo puesta a on, debido a que estas funciones no pertenecen ya al estándar"
  9762. "ANSI y por lo tanto no son portables entre distintas implementaciones del C."
  9763. endv
  9764. begint
  9765. beginvis
  9766. no_multiatributo
  9767. no_posicion
  9768. cabecera " FUNCIONES DE TURBO C EN FICHERO DE CABECERA IO.H "
  9769. coordenadas_completas 1 2 80 24
  9770. color 0 3
  9771. borde 2
  9772. "GLOSARIO:"
  9773. ""
  9774. " ▄▄▄▄▄▄▄▄"
  9775. " ▌access▐   Determina la accesibilidad de un fichero."
  9776. " ▀▀▀▀▀▀▀▀"
  9777. " ▄▄▄▄▄▄▄"
  9778. " ▌chmod▐   Cambia el modo de acceso."
  9779. " ▀▀▀▀▀▀▀"
  9780. " ▄▄▄▄▄▄▄▄"
  9781. " ▌_chmod▐   Cambia el modo de acceso."
  9782. " ▀▀▀▀▀▀▀▀"
  9783. " ▄▄▄▄▄▄▄▄"
  9784. " ▌chsize▐   Cambia tamaño de fichero."
  9785. " ▀▀▀▀▀▀▀▀"
  9786. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  9787. " ▌_close/close▐   Cierra un descriptor de fichero."
  9788. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  9789. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  9790. " ▌_creat/creat▐   Crea un nuevo fichero o sobreescribe uno existente."
  9791. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  9792. " ▄▄▄▄▄▄▄▄▄▄"
  9793. " ▌creatnew▐   Crea un nuevo fichero."
  9794. " ▀▀▀▀▀▀▀▀▀▀"
  9795. " ▄▄▄▄▄▄▄▄▄▄▄"
  9796. " ▌creattemp▐   Crea un fichero único en el directorio dado por el nombre de"
  9797. " ▀▀▀▀▀▀▀▀▀▀▀   fichero."
  9798. " ▄▄▄▄▄"
  9799. " ▌dup▐   Duplica un descriptor de fichero."
  9800. " ▀▀▀▀▀"
  9801. " ▄▄▄▄▄▄"
  9802. " ▌dup2▐   Duplica el descriptor de fichero viejo_descriptor sobre el"
  9803. " ▀▀▀▀▀▀   descriptor de fichero existente nuevo_descriptor."
  9804. " ▄▄▄▄▄"
  9805. " ▌eof▐   Chequea fin de fichero."
  9806. " ▀▀▀▀▀"
  9807. " ▄▄▄▄▄▄▄▄▄▄▄▄"
  9808. " ▌filelength▐   Obtiene el tamaño de un fichero en bytes."
  9809. " ▀▀▀▀▀▀▀▀▀▀▀▀"
  9810. " ▄▄▄▄▄▄▄▄▄▄"
  9811. " ▌getftime▐   Obtiene fecha y hora de un fichero."
  9812. " ▀▀▀▀▀▀▀▀▀▀"
  9813. " ▄▄▄▄▄▄▄"
  9814. " ▌ioctl▐   Controla dispositivos de I/O."
  9815. " ▀▀▀▀▀▀▀"
  9816. " ▄▄▄▄▄▄▄▄"
  9817. " ▌isatty▐   Chequea tipo de dispositivo."
  9818. " ▀▀▀▀▀▀▀▀"
  9819. " ▄▄▄▄▄▄"
  9820. " ▌lock▐   Pone los bloqueos de compartición de ficheros para controlar el"
  9821. " ▀▀▀▀▀▀   acceso concurrente de ficheros."
  9822. " ▄▄▄▄▄▄▄"
  9823. " ▌lseek▐   Mueve el puntero de fichero de lectura/escritura."
  9824. " ▀▀▀▀▀▀▀"
  9825. " ▄▄▄▄▄▄"
  9826. " ▌open▐   Abre un fichero para lectura o escritura."
  9827. " ▀▀▀▀▀▀"
  9828. " ▄▄▄▄▄▄▄"
  9829. " ▌_open▐   Abre un fichero para lectura o escritura."
  9830. " ▀▀▀▀▀▀▀"
  9831. " ▄▄▄▄▄▄"
  9832. " ▌read▐   Lee de un fichero."
  9833. " ▀▀▀▀▀▀"
  9834. " ▄▄▄▄▄▄▄"
  9835. " ▌_read▐   Lee de fichero."
  9836. " ▀▀▀▀▀▀▀"
  9837. " ▄▄▄▄▄▄▄▄▄▄"
  9838. " ▌setftime▐   Pone fecha y hora de un fichero."
  9839. " ▀▀▀▀▀▀▀▀▀▀"
  9840. " ▄▄▄▄▄▄▄▄▄"
  9841. " ▌setmode▐   Pone modo de un fichero de apertura."
  9842. " ▀▀▀▀▀▀▀▀▀"
  9843. " ▄▄▄▄▄▄▄"
  9844. " ▌sopen▐   Macro que abre un fichero en el modo compartido."
  9845. " ▀▀▀▀▀▀▀"
  9846. " ▄▄▄▄▄▄"
  9847. " ▌tell▐   Obtiene la posición corriente de un puntero de fichero."
  9848. " ▀▀▀▀▀▀"
  9849. " ▄▄▄▄▄▄▄▄"
  9850. " ▌unlink▐   Borra un fichero."
  9851. " ▀▀▀▀▀▀▀▀"
  9852. " ▄▄▄▄▄▄▄▄"
  9853. " ▌unlock▐   Libera bloqueos de compartición de ficheros para controlar el"
  9854. " ▀▀▀▀▀▀▀▀   acceso concurrente."
  9855. " ▄▄▄▄▄▄▄"
  9856. " ▌write▐   Escribe en un fichero."
  9857. " ▀▀▀▀▀▀▀"
  9858. " ▄▄▄▄▄▄▄▄"
  9859. " ▌_write▐   Escribe en un fichero."
  9860. " ▀▀▀▀▀▀▀▀"
  9861. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  9862. "  HANDLE_MAX (#define)    Número máximo de descriptores."
  9863. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  9864.  
  9865. ""
  9866. ""
  9867. "ESTUDIO DE LAS FUNCIONES EXPUESTAS EN EL GLOSARIO:"
  9868. ""
  9869. " ▄▄▄▄▄▄▄▄"
  9870. " ▌access▐   Determina la accesibilidad de un fichero."
  9871. " ▀▀▀▀▀▀▀▀"
  9872. ""
  9873. " Sintaxis:"
  9874. "   int access (const char *nombre_fichero, int modo_acceso);"
  9875. ""
  9876. " ■ modo_acceso = 0 chequea para existencia de fichero"
  9877. " ■ modo_acceso = 2 chequea para permiso de escritura"
  9878. " ■ modo_acceso = 4 chequea para permiso de lectura"
  9879. " ■ modo_acceso = 6 chequea para permiso de lectura y escritura"
  9880. ""
  9881. "Si el acceso requerido es permitido, devuelve 0; en otro caso, devuelve -1"
  9882. "y se asigna un valor a la variable errno."
  9883. ""
  9884. "Ejemplo:"
  9885. ""
  9886. " #include <stdio.h>"
  9887. " #include <io.h>"
  9888. ""
  9889. " int existe_fichero (char *nombre_fichero);"
  9890. ""
  9891. " int main (void)"
  9892. " {"
  9893. "   printf ("%d existe NOEXISTE.FIC\n","
  9894. "           existe_fichero ("NOEXISTE.FIC") ? "Sí" : "No");"
  9895. "   return 0;"
  9896. " }"
  9897. ""
  9898. " int existe_fichero (char *nombre_fichero)"
  9899. " {"
  9900. "   return (access (nombre_fichero, 0) == 0);"
  9901. " }"
  9902. ""
  9903. ""
  9904. " ▄▄▄▄▄▄▄"
  9905. " ▌chmod▐   Cambia el modo de acceso."
  9906. " ▀▀▀▀▀▀▀"
  9907. ""
  9908. " Sintaxis:"
  9909. "   int chmod (const char *path, int modo_acceso);"
  9910. ""
  9911. "Cuando tiene éxito chmod() cambia el modo de acceso al fichero y devuelve 0."
  9912. "En otro caso chmod() devuelve -1."
  9913. ""
  9914. "El parámetro modo_acceso puede tomar alguno de los siguientes valores"
  9915. "definidos en <sys\stat.h>:"
  9916. ""
  9917. "  S_IFMT     Máscara de tipo de fichero"
  9918. "  S_IFDIR    Directorio"
  9919. "  S_IFIFO    FIFO especial"
  9920. "  S_IFCHR    Carácter especial"
  9921. "  S_IFBLK    Bloque especial"
  9922. "  S_IFREG    Fichero regular"
  9923. "  S_IREAD    Poseedor puede leer"
  9924. "  S_IWRITE   Poseedor puede escribir"
  9925. "  S_IEXEC    Poseedor puede ejecutar"
  9926. ""
  9927. ""
  9928. "Ejemplo:"
  9929. ""
  9930. " #include <sys\stat.h>"
  9931. " #include <stdio.h>"
  9932. " #include <io.h>"
  9933. ""
  9934. " void hacer_solo_lectura (char *nombre_fichero);"
  9935. ""
  9936. " int main (void)"
  9937. " {"
  9938. "   hacer_solo_lectura ("NOEXISTE.FIC");"
  9939. "   hacer_solo_lectura ("MIFICH.FIC");"
  9940. "   return 0;"
  9941. " }"
  9942. ""
  9943. " void hacer_solo_lectura (char *nombre_fichero)"
  9944. " {"
  9945. "    int estado;"
  9946. ""
  9947. "    estado = chmod (nombre_fichero, S_IREAD);"
  9948. "    if (estado)"
  9949. "      printf ("No se pudo hacer %s sólo lectura\n", nombre_fichero);"
  9950. "    else"
  9951. "      printf ("Hecho %s sólo lectura\n", nombre_fichero);"
  9952. " }"
  9953. ""
  9954. ""
  9955. " ▄▄▄▄▄▄▄▄"
  9956. " ▌_chmod▐   Cambia el modo de acceso."
  9957. " ▀▀▀▀▀▀▀▀"
  9958. ""
  9959. " Sintaxis:"
  9960. "   int _chmod (const char *path, int func [ , int atrib ] );"
  9961. ""
  9962. "Si func es 0, _chmod() devuelve los atributos del fichero. Si func es 1,"
  9963. "los atributos son puestos. Si la operación tiene éxito, _chmod() devuelve"
  9964. "la palabra de atributo del fichero; en otro caso, devuelve -1. En el caso"
  9965. "de un error se asigna valor a errno."
  9966. ""
  9967. "El parámetro atrib representa los atributos de fichero de MS-DOS y puede"
  9968. "tomar los siguientes valores definidos en dos.h:"
  9969. ""
  9970. "  FA_RDONLY   Atributo de sólo lectura"
  9971. "  FA_HIDDEN   Fichero oculto"
  9972. "  FA_SYSTEM   Fichero de sistema"
  9973. "  FA_LABEL    Etiqueta de la unidad"
  9974. "  FA_DIREC    Directorio"
  9975. "  FA_ARCH     Archivo"
  9976. ""
  9977. ""
  9978. " ▄▄▄▄▄▄▄▄"
  9979. " ▌chsize▐   Cambia tamaño de fichero."
  9980. " ▀▀▀▀▀▀▀▀"
  9981. ""
  9982. " Sintaxis:"
  9983. "   int chsize (int descriptor, long tamanio);"
  9984. ""
  9985. "Si tiene éxito, chsize() devuelve 0. Si falla, devuelve -1 y se le da"
  9986. "valor a errno."
  9987. ""
  9988. "Ejemplo:"
  9989. ""
  9990. " #include <string.h> /*para utilizar strlen(): devuelve longitud de string*/"
  9991. " #include <fcntl.h> /* para utilizar la constante O_CREAT, ver open() */"
  9992. " #include <io.h> /* para utilizar write(), chsize() y close() */"
  9993. ""
  9994. " int main (void)"
  9995. " {"
  9996. "   int descriptor;"
  9997. "   char buf[11] = "0123456789";"
  9998. ""
  9999. "   /* crea fichero de texto conteniendo 10 bytes */"
  10000. "   descritor = open ("FICH.FIC", O_CREAT);"
  10001. "   write (descriptor, buf, strlen (buf));"
  10002. ""
  10003. "   /* truncar el fichero a 5 bytes de tamaño */"
  10004. "   chsize (descriptor, 5);"
  10005. ""
  10006. "   /* cierra el fichero */"
  10007. "   close(handle);"
  10008. "   return 0;"
  10009. " }"
  10010. ""
  10011. ""
  10012. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  10013. " ▌_close/close▐   Cierra un descriptor de fichero."
  10014. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  10015. ""
  10016. " Sintaxis:"
  10017. "   int _close (int descriptor);"
  10018. "   int close (int descriptor);"
  10019. ""
  10020. "Si tiene éxito, close() y _close() devuelven 0; en caso contrario, estas"
  10021. "funciones devuelven -1 y se le da valor a errno."
  10022. ""
  10023. "Ejemplo:"
  10024. ""
  10025. " #include <string.h>"
  10026. " #include <stdio.h>"
  10027. " #include <fcntl.h>"
  10028. " #include <io.h>"
  10029. ""
  10030. " void main (void)"
  10031. " {"
  10032. "    int descriptor;"
  10033. "    char buf[11] = "0123456789";"
  10034. ""
  10035. "    /* crea un fichero conteniendo 10 bytes */"
  10036. "    descriptor = open ("NUEVO.FIC", O_CREAT);"
  10037. "    if (descriptor > -1)"
  10038. "      {"
  10039. "        write (descriptor, buf, strlen (buf));"
  10040. ""
  10041. "        /* cierra el fichero */"
  10042. "        close (descriptor);"
  10043. "      }"
  10044. "    else"
  10045. "      {"
  10046. "        printf ("Error abriendo fichero\n");"
  10047. "      }"
  10048. "    return 0;"
  10049. " }"
  10050. ""
  10051. ""
  10052. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  10053. " ▌_creat/creat▐   Crea un nuevo fichero o sobreescribe uno existente."
  10054. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  10055. ""
  10056. " Sintaxis:"
  10057. "   int _creat (const char *path, int atrib);"
  10058. "   int creat (const char *path, int modo_acceso);"
  10059. ""
  10060. "La función creat() abre el fichero en el modo dado por la variable global"
  10061. "_fmode. La función _creat() siempre abre en modo binario. Si la operación"
  10062. "tiene éxito, el descriptor del nuevo fichero es devuelto; en caso contario,"
  10063. "un -1 es devuelto y asignado valor a errno."
  10064. ""
  10065. "Los valores posibles para modo_acceso se describieron en la función chmod()."
  10066. ""
  10067. "La variable global _fmode está definida en los ficheros fcntl.h y stdlib.h"
  10068. "de esta forma: int _fmode; Por defecto, se inicializa con el valor O_TEXT."
  10069. ""
  10070. "Ejemplo:"
  10071. ""
  10072. " #include <sys\stat.h>"
  10073. " #include <string.h>"
  10074. " #include <fcntl.h>"
  10075. " #include <io.h>"
  10076. ""
  10077. " int main (void)"
  10078. " {"
  10079. "   int descriptor;"
  10080. "   char buf[11] = "0123456789";"
  10081. ""
  10082. "   /* cambia el modo de fichero por defecto de texto a binario */"
  10083. "   _fmode = O_BINARY;"
  10084. ""
  10085. "   /* crea un fichero binario para lectura y escritura */"
  10086. "   descriptor = creat ("FICHERO.FIC", S_IREAD | S_IWRITE);"
  10087. ""
  10088. "   /* escribe 10 bytes al fichero */"
  10089. "   write (descriptor, buf, strlen (buf));"
  10090. ""
  10091. "   /* cierra el fichero */"
  10092. "   close (descriptor);"
  10093. "   return 0;"
  10094. " }"
  10095. ""
  10096. ""
  10097. " ▄▄▄▄▄▄▄▄▄▄"
  10098. " ▌creatnew▐   Crea un nuevo fichero."
  10099. " ▀▀▀▀▀▀▀▀▀▀"
  10100. ""
  10101. " Sintaxis:"
  10102. "   int creatnew (const char *path, int modo);"
  10103. ""
  10104. "La función creatnew es identica a la función _creat() con la excepción de"
  10105. "que es devuelto un error si el fichero ya existe. (Versiones del DOS 3.0"
  10106. "o superiores)"
  10107. ""
  10108. "Los valores posibles para el parámetro modo se explicaron en la función"
  10109. "creat()."
  10110. ""
  10111. "Ejemplo:"
  10112. ""
  10113. " #include <string.h>"
  10114. " #include <stdio.h>"
  10115. " #include <errno.h>"
  10116. " #include <dos.h>"
  10117. " #include <io.h>"
  10118. ""
  10119. " int main (void)"
  10120. " {"
  10121. "   int descriptor;"
  10122. "   char buf[11] = "0123456789";"
  10123. ""
  10124. "   /* intenta crear un fichero que no existe */"
  10125. "   descriptor = creatnew ("FICHERO.FIC", 0);"
  10126. ""
  10127. "   if (descriptor == -1)"
  10128. "     printf ("FICHERO.FIC ya existe.\n");"
  10129. "   else"
  10130. "     {"
  10131. "       printf ("FICHERO.FIC creado con éxito.\n");"
  10132. "       write (descriptor, buf, strlen (buf));"
  10133. "       close (descriptor);"
  10134. "     }"
  10135. "   return 0;"
  10136. " }"
  10137. ""
  10138. ""
  10139. " ▄▄▄▄▄▄▄▄▄▄▄"
  10140. " ▌creattemp▐   Crea un fichero único en el directorio dado por el nombre de"
  10141. " ▀▀▀▀▀▀▀▀▀▀▀   fichero."
  10142. ""
  10143. " Sintaxis:"
  10144. "   int creattemp (char *path, int atrib);"
  10145. ""
  10146. "Esta función es similar a la función _creat(), excepto que el nombre de"
  10147. "fichero es el nombre de path que debe terminar con un \. El nombre de"
  10148. "fichero debería ser bastante grande para alojar el nombre de fichero."
  10149. "(Versiones de MS-DOS 3.0 o superiores)"
  10150. ""
  10151. "Los valores posibles para atrib son los mismos que para la función creat()."
  10152. ""
  10153. "Ejemplo:"
  10154. ""
  10155. " #include <string.h>"
  10156. " #include <stdio.h>"
  10157. " #include <io.h>"
  10158. ""
  10159. " int main (void)"
  10160. " {"
  10161. "   int descriptor;"
  10162. "   char nombre_de_path[128];"
  10163. ""
  10164. "   strcpy (nombre_de_path, "\\"); /*copia el string "\\" en nombre_de_path*/"
  10165. ""
  10166. "   /* crea un fichero único en el directorio raíz */"
  10167. "   descriptor = creattemp (nombre_de_path, 0);"
  10168. ""
  10169. "   printf ("%s fue el fichero único creado.\n", nombre_de_path);"
  10170. "   close (descriptor);"
  10171. "   return 0;"
  10172. " }"
  10173. ""
  10174. ""
  10175. " ▄▄▄▄▄"
  10176. " ▌dup▐   Duplica un descriptor de fichero."
  10177. " ▀▀▀▀▀"
  10178. ""
  10179. " Sintaxis:"
  10180. "   int dup (int descriptor);"
  10181. ""
  10182. "Si la operación tiene éxito, dup() devuelve el descriptor del nuevo fichero;"
  10183. "en otro caso, dup() devuelve -1 y se asigna valor a errno."
  10184. ""
  10185. ""
  10186. " ▄▄▄▄▄▄"
  10187. " ▌dup2▐   Duplica el descriptor de fichero viejo_descriptor sobre el"
  10188. " ▀▀▀▀▀▀   descriptor de fichero existente nuevo_descriptor."
  10189. ""
  10190. " Sintaxis:"
  10191. "   int dup2 (int viejo_descriptor, int nuevo_descriptor);"
  10192. ""
  10193. "Devuelve 0 si tiene éxito; -1 si ocurre un error."
  10194. ""
  10195. ""
  10196. " ▄▄▄▄▄"
  10197. " ▌eof▐   Chequea fin de fichero."
  10198. " ▀▀▀▀▀"
  10199. ""
  10200. " Sintaxis:"
  10201. "   int eof (int descriptor);"
  10202. ""
  10203. "Devuelve uno de los siguientes valores:"
  10204. ""
  10205. " Valor  │ Significado"
  10206. "════════╪═══════════════════════════"
  10207. "   1    │ Fin de fichero"
  10208. "   0    │ No fin de fichero"
  10209. "  -1    │ Error; errno es asignado"
  10210. ""
  10211. ""
  10212. " ▄▄▄▄▄▄▄▄▄▄▄▄"
  10213. " ▌filelength▐   Obtiene el tamaño de un fichero en bytes."
  10214. " ▀▀▀▀▀▀▀▀▀▀▀▀"
  10215. ""
  10216. " Sintaxis:"
  10217. "   long filelength (int descriptor);"
  10218. ""
  10219. "Si ocurre un error, devuelve -1 y se asigna valor a errno."
  10220. ""
  10221. "Ejemplo:"
  10222. ""
  10223. " #include <string.h>"
  10224. " #include <stdio.h>"
  10225. " #include <fcntl.h>"
  10226. " #include <io.h>"
  10227. ""
  10228. " int main (void)"
  10229. " {"
  10230. "   int descriptor;"
  10231. "   char buf[11] = "0123456789";"
  10232. ""
  10233. "   /* crea un fichero conteniendo 10 bytes */"
  10234. "   descriptor = open ("FICHERO.FIC", O_CREAT);"
  10235. "   write (descriptor, buf, strlen (buf));"
  10236. ""
  10237. "   /* visualiza el tamaño del fichero */"
  10238. "   printf ("Longitud del fichero en bytes: %ld\n", filelength (descriptor));"
  10239. ""
  10240. "   /* cierra el fichero */"
  10241. "   close (descriptor);"
  10242. "   return 0;"
  10243. " }"
  10244. ""
  10245. ""
  10246. " ▄▄▄▄▄▄▄▄▄▄"
  10247. " ▌getftime▐   Obtiene fecha y hora de un fichero."
  10248. " ▀▀▀▀▀▀▀▀▀▀"
  10249. ""
  10250. " Sintaxis:"
  10251. "   int getftime (int descriptor, struct ftime *pftime);"
  10252. ""
  10253. "Devuelve 0 si tiene éxito, -1 si ocurre un error y además pone errno."
  10254. ""
  10255. "La descripción de struct ftime se ha descrito en la función setftime()."
  10256. ""
  10257. ""
  10258. " ▄▄▄▄▄▄▄"
  10259. " ▌ioctl▐   Controla dispositivos de I/O."
  10260. " ▀▀▀▀▀▀▀"
  10261. ""
  10262. " Sintaxis:"
  10263. "   int ioctl (int descriptor, int func [ , void *argdx, int argcx ] );"
  10264. ""
  10265. "Para func 0 o 1, el valor devuelto es la información del dispositivo (DX de"
  10266. "la llamada de IOCTL)."
  10267. ""
  10268. "Para valores de func de 2 hasta 5, el valor devuelto es el número de bytes"
  10269. "transferidos realmente."
  10270. ""
  10271. "Para los valores de func 6 ó 7, el valor devuelto es el estado del"
  10272. "dispositivo."
  10273. ""
  10274. "En cualquier caso, si es detectado un error, un valor de -1 es devuelto, y"
  10275. "se da valor a errno."
  10276. ""
  10277. "IOCTL (Control de entrada/salida para los dispositivos) es la función 68"
  10278. "(44 hexadecimal) de la interrupción 21 hexadecimal del DOS. Esta función"
  10279. "del DOS tiene varias subfunciones que realizan distintas tareas. En las"
  10280. "versiones DOS-3 había 11 subfunciones. El argumento func de ioctl() del C"
  10281. "se corresponde con dichas subfunciones. Para saber lo que hace cada sub-"
  10282. "función debe consultar tu manual del DOS."
  10283. ""
  10284. "Los argumentos argdx y argcx se refieren a los registros DX y CX de la"
  10285. "CPU."
  10286. ""
  10287. ""
  10288. " ▄▄▄▄▄▄▄▄"
  10289. " ▌isatty▐   Chequea tipo de dispositivo."
  10290. " ▀▀▀▀▀▀▀▀"
  10291. ""
  10292. " Sintaxis:"
  10293. "   int isatty (int descriptor);"
  10294. ""
  10295. "Si el dispositivo es un dispositivo de carácter, isatty() devuelve un"
  10296. "valor distinto de cero."
  10297. ""
  10298. "Ejemplo:"
  10299. ""
  10300. " #include <stdio.h>"
  10301. " #include <io.h>"
  10302. ""
  10303. " int main (void)"
  10304. " {"
  10305. "   int descriptor;"
  10306. ""
  10307. "   descriptor = fileno (stdprn);"
  10308. "   if (isatty (descriptor))"
  10309. "     printf("Descriptor %d es un tipo de dispositivo\n", descriptor);"
  10310. "   else"
  10311. "     printf("Descriptor %d no es un tipo de dispositivo\n", descriptor);"
  10312. "   return 0;"
  10313. " }"
  10314. ""
  10315. ""
  10316. " ▄▄▄▄▄▄"
  10317. " ▌lock▐   Pone los bloqueos de compartición de ficheros para controlar el"
  10318. " ▀▀▀▀▀▀   acceso concurrente de ficheros."
  10319. ""
  10320. " Sintaxis:"
  10321. "   int lock (int descriptor, long desplazamiento, long longitud);"
  10322. ""
  10323. "Previene el acceso de lectura o escritura por otro programa para la región"
  10324. "que empieza en la dirección desplazamiento y abarca longitud bytes."
  10325. ""
  10326. "Devuelve 0 en caso de éxito, -1 en caso de error."
  10327. ""
  10328. ""
  10329. " ▄▄▄▄▄▄▄"
  10330. " ▌lseek▐   Mueve el puntero de fichero de lectura/escritura."
  10331. " ▀▀▀▀▀▀▀"
  10332. ""
  10333. " Sintaxis:"
  10334. "   long lseek (int descriptor, long desplazamiento, int desde_donde);"
  10335. ""
  10336. "Devuelve la nueva posición del fichero, medida en bytes desde el comienzo"
  10337. "del fichero. Devuelve -1L en caso de error, y da valor a errno."
  10338. ""
  10339. ""
  10340. " ▄▄▄▄▄▄"
  10341. " ▌open▐   Abre un fichero para lectura o escritura."
  10342. " ▀▀▀▀▀▀"
  10343. ""
  10344. " Sintaxis:"
  10345. "   int open (const char *path, int acceso [ , unsigned modo ] );"
  10346. ""
  10347. "Si la operación se hace correctamente, open() devuelve un descriptor de"
  10348. "fichero; en cualquier otro caso devuelve -1 y le da valor a errno."
  10349. ""
  10350. "Las definiciones de bits para el argumento acceso están en el fichero"
  10351. "fcntl.h y son las siguientes:"
  10352. ""
  10353. "  O_APPEND   Añade a final de fichero"
  10354. "  O_BINARY   No traslación"
  10355. "  O_CREAT    Crea y abre fichero"
  10356. "  O_EXCL     Apertura exclusiva"
  10357. "  O_RDONLY   Sólo lectura"
  10358. "  O_RDWR     Lectura/escritura"
  10359. "  O_TEXT     Traslación CR-LF"
  10360. "  O_TRUNC    Apertura con truncación"
  10361. "  O_WRONLY   Sólo escritura"
  10362. ""
  10363. "Para _open(), el valor de acceso en MS-DOS 2.x está limitado a O_RDONLY,"
  10364. "O_WRONLY y O_RDWR."
  10365. ""
  10366. "Para MS-DOS 3.x, los siguientes valores adicionales pueden ser usados"
  10367. "también:"
  10368. ""
  10369. "  O_NOINHERIT   Proceso hijo hereda fichero"
  10370. "  O_DENYALL     Error si abierto para lectura/escritura"
  10371. "  O_DENYWRITE   Error si abierto para escritura"
  10372. "  O_DENYREAD    Error si abierto para lectura"
  10373. "  O_DENYNONE    Permite acceso concurrente"
  10374. ""
  10375. "Sólo una de las opciones O_DENYxxx pueden ser incluidas en una simple"
  10376. "apertura."
  10377. ""
  10378. "Los valores posibles que puede tomar el argumento modo se describieron"
  10379. "en la función chmod()."
  10380. ""
  10381. "Ejemplo:"
  10382. ""
  10383. " #include <string.h>"
  10384. " #include <stdio.h>"
  10385. " #include <fcntl.h>"
  10386. " #include <io.h>"
  10387. ""
  10388. " int main (void)"
  10389. " {"
  10390. "   int descriptor;"
  10391. "   char mensaje[] = "Hola mundo";"
  10392. ""
  10393. "   if ((descriptor = open ("PRUEBA.$$$", O_CREAT | O_TEXT)) == -1)"
  10394. "     {"
  10395. "       perror ("Error");"
  10396. "       return 1;"
  10397. "     }"
  10398. "   write (descriptor, mensaje, strlen (mensaje));"
  10399. "   close (descriptor);"
  10400. "   return 0;"
  10401. " }"
  10402. ""
  10403. ""
  10404. " ▄▄▄▄▄▄▄"
  10405. " ▌_open▐   Abre un fichero para lectura o escritura."
  10406. " ▀▀▀▀▀▀▀"
  10407. ""
  10408. " Sintaxis:"
  10409. "   int _open (const char *nombre_de_fichero, int flags);"
  10410. ""
  10411. "Si la operación tiene éxito, _open() devuelve un descriptor de fichero; en"
  10412. "cualquier otro caso devuelve -1."
  10413. ""
  10414. "Las definiciones de bits para el argumento flags son las mismas que para"
  10415. "el argumento acceso en la descripción de la función open()."
  10416. ""
  10417. "Ejemplo:"
  10418. ""
  10419. " #include <string.h>"
  10420. " #include <stdio.h>"
  10421. " #include <fcntl.h>"
  10422. " #include <io.h>"
  10423. ""
  10424. " int main (void)"
  10425. " {"
  10426. "   int descriptor;"
  10427. "   char mensaje[] = "Hola mundo";"
  10428. ""
  10429. "   if ((descriptor = _open ("PRUEBA.$$$", O_RDWR)) == -1)"
  10430. "     {"
  10431. "       perror ("Error");"
  10432. "       return 1;"
  10433. "     }"
  10434. "   _write (descriptor, mensaje, strlen (mensaje));"
  10435. "   _close (descriptor);"
  10436. "   return 0;"
  10437. " }"
  10438. ""
  10439. ""
  10440. " ▄▄▄▄▄▄"
  10441. " ▌read▐   Lee de un fichero."
  10442. " ▀▀▀▀▀▀"
  10443. ""
  10444. " Sintaxis:"
  10445. "   int read (int descriptor, void *buffer, unsigned longitud);"
  10446. ""
  10447. "Si la operación tiene éxito, devuelve un entero indicando el número de"
  10448. "bytes colocados en el buffer; si el fichero fue abierto en modo texto,"
  10449. "read() no cuenta retornos de carros o caracteres Ctrl-Z en el número de"
  10450. "bytes leídos."
  10451. ""
  10452. "En caso de error, devuelve -1 y le da valor a errno."
  10453. ""
  10454. ""
  10455. " ▄▄▄▄▄▄▄"
  10456. " ▌_read▐   Lee de fichero."
  10457. " ▀▀▀▀▀▀▀"
  10458. ""
  10459. " Sintaxis:"
  10460. "   int _read (int descriptor, void *buffer, unsigned longitud);"
  10461. ""
  10462. "Devuelve el número de bytes leídos; si se detecta el fin de fichero,"
  10463. "devuelve 0; si ocurre un error devuelve -1 y da valor a errno."
  10464. ""
  10465. ""
  10466. " ▄▄▄▄▄▄▄▄▄▄"
  10467. " ▌setftime▐   Pone fecha y hora de un fichero."
  10468. " ▀▀▀▀▀▀▀▀▀▀"
  10469. ""
  10470. " Sintaxis:"
  10471. "   int setftime (int descriptor, struct ftime *ptime);"
  10472. ""
  10473. "Devuelve 0 si tiene éxito; en otro caso devuelve -1."
  10474. ""
  10475. "struct ftime está declarada en el fichero io.h del siguiente modo:"
  10476. ""
  10477. "  struct ftime {"
  10478. "    unsigned  ft_tsec  : 5; /* intervalo de dos segundos */ "
  10479. "    unsigned  ft_min   : 6; /* minutos */"
  10480. "    unsigned  ft_hour  : 5; /* horas */"
  10481. "    unsigned  ft_day   : 5; /* días */"
  10482. "    unsigned  ft_month : 4; /* meses */"
  10483. "    unsigned  ft_year  : 7; /* año */"
  10484. "  };"
  10485. ""
  10486. ""
  10487. " ▄▄▄▄▄▄▄▄▄"
  10488. " ▌setmode▐   Pone modo de un fichero de apertura."
  10489. " ▀▀▀▀▀▀▀▀▀"
  10490. ""
  10491. " Sintaxis:"
  10492. "   int setmode (int descriptor, int modo);"
  10493. ""
  10494. "Devuelve 0 si tiene éxito; en otro caso -1."
  10495. ""
  10496. "Los valores posibles de modo se describieron en la función open()."
  10497. ""
  10498. "Ejemplo:"
  10499. ""
  10500. " #include <stdio.h>"
  10501. " #include <fcntl.h>"
  10502. " #include <io.h>"
  10503. ""
  10504. " int main (void)"
  10505. " {"
  10506. "   int resultado;"
  10507. ""
  10508. "   resultado = setmode (fileno (stdprn), O_TEXT);"
  10509. "   if (resultado == -1)"
  10510. "     perror ("Modo no disponible");"
  10511. "   else"
  10512. "     printf ("Modo cambiado con éxito");"
  10513. "   return 0;"
  10514. " }"
  10515. ""
  10516. ""
  10517. " ▄▄▄▄▄▄▄"
  10518. " ▌sopen▐   Macro que abre un fichero en el modo compartido."
  10519. " ▀▀▀▀▀▀▀"
  10520. ""
  10521. " Sintaxis:"
  10522. "   sopen (path, acceso, shflag, modo)"
  10523. ""
  10524. "Está incluido para compatibilidad con las distintas versiones de Turbo C"
  10525. "y otros compiladores."
  10526. ""
  10527. "El significado de los parámetros acceso y modo se han explicado en las"
  10528. "funciones open() y chmod() respectivamente. El parámetro shflag contiene"
  10529. "el modo de compartición de ficheros y las constantes definidas para ello"
  10530. "en el fichero share.h son las siguientes:"
  10531. ""
  10532. "  SH_COMPAT     Modo de compatibilidad"
  10533. "  SH_DENYRW     Denegado acceso de lectura y escritura"
  10534. "  SH_DENYWR     Denegado acceso de escritura"
  10535. "  SH_DENYRD     Denegado acceso de lectura"
  10536. "  SH_DENYNONE   Permite acceso de lectura y escritura"
  10537. "  SH_DENYNO     Igual que SH_DENYNONE (compatibilidad)"
  10538. ""
  10539. ""
  10540. " ▄▄▄▄▄▄"
  10541. " ▌tell▐   Obtiene la posición corriente de un puntero de fichero."
  10542. " ▀▀▀▀▀▀"
  10543. ""
  10544. " Sintaxis:"
  10545. "   long tell (int descriptor);"
  10546. ""
  10547. "Devuelve la posición actual del puntero de fichero o -1 en caso de error."
  10548. ""
  10549. "Ejemplo:"
  10550. ""
  10551. " #include <string.h>"
  10552. " #include <stdio.h>"
  10553. " #include <fcntl.h>"
  10554. " #include <io.h>"
  10555. ""
  10556. " int main (void)"
  10557. " {"
  10558. "   int descriptor;"
  10559. "   char mensaje[] = "Hola mundo";"
  10560. ""
  10561. "   if ((descriptor = open ("PRUEBA.$$$", O_CREAT | O_TEXT | O_APPEND)) == -1)"
  10562. "     {"
  10563. "       perror ("Error");"
  10564. "       return 1;"
  10565. "     }"
  10566. "   write (descriptor, mensaje, strlen (mensaje));"
  10567. "   printf ("El puntero de fichero está en el byte %ld\n", tell (descriptor));"
  10568. "   close (descriptor);"
  10569. "   return 0;"
  10570. " }"
  10571. ""
  10572. ""
  10573. " ▄▄▄▄▄▄▄▄"
  10574. " ▌unlink▐   Borra un fichero."
  10575. " ▀▀▀▀▀▀▀▀"
  10576. ""
  10577. " Sintaxis:"
  10578. "   int unlink (const char *nombre_de_fichero);"
  10579. ""
  10580. "Si el nombre de fichero tiene atributo de sólo lectura, unlink fallará."
  10581. "Llama a chmod() primero para cambiar el atributo de fichero."
  10582. ""
  10583. "Devuelve 0 en caso de éxito; -1 en caso de error."
  10584. ""
  10585. "El prototipo de esta función está en los ficheros dos.h, io.h y stdio.h."
  10586. "La función remove() cuyo prototipo se encuentra en stdio.h es en realidad"
  10587. "una macro que se expande a una llamada a unlink()."
  10588. ""
  10589. ""
  10590. " ▄▄▄▄▄▄▄▄"
  10591. " ▌unlock▐   Libera bloqueos de compartición de ficheros para controlar el"
  10592. " ▀▀▀▀▀▀▀▀   acceso concurrente."
  10593. ""
  10594. " Sintaxis:"
  10595. "   int unlock (int descriptor, long desplazamiento, long longitud);"
  10596. ""
  10597. "Devuelve 0 si tiene éxito; -1 si ocurre un error."
  10598. ""
  10599. ""
  10600. " ▄▄▄▄▄▄▄"
  10601. " ▌write▐   Escribe en un fichero."
  10602. " ▀▀▀▀▀▀▀"
  10603. ""
  10604. " Sintaxis:"
  10605. "   int write (int descriptor, void *buffer, unsigned longitud);"
  10606. ""
  10607. "Devuelve el número de bytes escritos, o -1 si ocurre un error."
  10608. ""
  10609. ""
  10610. " ▄▄▄▄▄▄▄▄"
  10611. " ▌_write▐   Escribe en un fichero."
  10612. " ▀▀▀▀▀▀▀▀"
  10613. ""
  10614. " Sintaxis:"
  10615. "   int _write (int descriptor, void *buffer, unsigned longitud);"
  10616. ""
  10617. "Devuelve el número de bytes escritos, o -1 si ocurre un error."
  10618. ""
  10619. ""
  10620. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  10621. "  HANDLE_MAX (#define)"
  10622. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  10623. ""
  10624. "Número máximo de descriptores."
  10625. ""
  10626. endvis
  10627. endt
  10628. end lección 9
  10629.  
  10630. ; LECCION 10
  10631. begin
  10632. beginv
  10633. borde 2
  10634. color 1 7
  10635. centrar_coordenadas
  10636. cabecera " INDICE DE LA LECCION 10 "
  10637. ""
  10638. "- Primera parte:"
  10639. ""
  10640. "  · Introducción a la biblioteca del C."
  10641. "  · Valores límites (~limits.h~)."
  10642. "  · Tipos y macros estándares (~stddef.h~)."
  10643. "  · Funciones de caracteres y de cadenas (~ctype.h~, ~string.h~)."
  10644. begint
  10645. "    (también ~mem.h~ para los usuarios de Turbo C)."
  10646. endt
  10647. "  · Funciones matemáticas (~math.h~)."
  10648. ""
  10649. "- Segunda parte:"
  10650. ""
  10651. "  · Funciones de pantalla y de gráficos (~conio.h~ y ~graphics.h~)."
  10652. endt
  10653. ""
  10654. endv
  10655. borrar_pantalla
  10656. beginvis
  10657. no_posicion
  10658. cabecera " INTRODUCCION A LA BIBLIOTECA DEL C "
  10659. color 14 1
  10660. borde 2
  10661. coordenadas_completas 3 3 78 23
  10662. ""
  10663. "La biblioteca de C contiene el código objeto de las funciones proporcio-"
  10664. "nadas con el compilador."
  10665. ""
  10666. "Aunque las bibliotecas (ficheros con extensión .LIB) son parecidas a"
  10667. "los ficheros objetos (fichero con extensión .OBJ), existe una diferencia"
  10668. "crucial: No todo el código de una biblioteca se añade al programa. Cuan-"
  10669. "do se enlaza un programa que consta de varios ficheros objetos, todo el"
  10670. "código de cada fichero objeto se convierte en parte del programa ejecu-"
  10671. "table final. Esto ocurre se esté o no utilizando el código. En otras"
  10672. "palabras, todos los ficheros objetos especificados en tiempo de enlace"
  10673. "se unen para formar el programa. Sin embargo, este no es el caso de los"
  10674. "ficheros de biblioteca."
  10675. ""
  10676. "Una biblioteca es una colección de funciones. A diferencia de un fichero"
  10677. "objeto, un fichero de biblioteca guarda una serie de información para"
  10678. "cada función de tal forma que cuando un programa hace referencia a una"
  10679. "función contenida en una biblioteca, el enlazador toma esta función y"
  10680. "añade el código objeto al programa. De esta forma sólo se añadirán al"
  10681. "fichero ejecutable aquellas funciones que realmente se utilicen en el"
  10682. "programa."
  10683. ""
  10684. "Para utilizar una función de biblioteca debemos incluir su correspon-"
  10685. "diente fichero de cabecera para que nuestro programa conozca el proto-"
  10686. "tipo de la función a utilizar. En los ficheros de cabecera (suelen tener"
  10687. "extensión .H) además de los prototipos de las funciones puede haber más"
  10688. "información como macros, declaración de tipos, declaración de variables"
  10689. "globales, etc."
  10690. ""
  10691. "Los ficheros de cabecera definidos por el estándar ANSI se presentan en"
  10692. "la siguiente tabla."
  10693. ""
  10694. ""
  10695. "Fichero de cabecera                   Propósito"
  10696. "------------------- ----------------------------------------------------"
  10697. ""
  10698. "    ~assert.h~        Define la macro assert()."
  10699. "    ~ctype.h ~        Uno de caracteres."
  10700. "    ~float.h ~        Define valores en coma flotante dependiente de la"
  10701. "    ~        ~        implementación."
  10702. "    ~limits.h~        Define los límites dependientes de la implementación."
  10703. "    ~locale.h~        Soporta la función setlocale()."
  10704. "    ~math.h  ~        Definiciones utilizadas por la biblioteca matemática."
  10705. "    ~setjmp.h~        Soporta saltos no locales."
  10706. "    ~signal.h~        Define los valores de señal."
  10707. "    ~stdarg.h~        Soporta listas de argumentos de longitud variable."
  10708. "    ~stddef.h~        Define algunas constantes de uso común."
  10709. "    ~stdio.h ~        Soporta la E/S de fichero."
  10710. "    ~stdlib.h~        Otras declaraciones."
  10711. "    ~string.h~        Soporta funciones de cadena."
  10712. "    ~time.h  ~        Soporta las funciones de tiempo del sistema."
  10713. ""
  10714. begint
  10715. ""
  10716. "Turbo C añade los siguientes ficheros de cabecera:"
  10717. ""
  10718. "Fichero de cabecera                   Propósito"
  10719. "------------------- ----------------------------------------------------"
  10720. ""
  10721. "    ~alloc.h   ~      Asignación dinámica."
  10722. "    ~bios.h    ~      Funciones relacionadas con la ROM BIOS."
  10723. "    ~conio.h   ~      E/S por consola."
  10724. "    ~dir.h     ~      Directorio."
  10725. "    ~dos.h     ~      Sistema operativo DOS."
  10726. "    ~errno.h   ~      Errores del sistema."
  10727. "    ~fcntl.h   ~      Constantes simbólicas utilizadas por open()."
  10728. "    ~graphics.h~      Gráficos."
  10729. "    ~io.h      ~      E/S estándar a bajo nivel."
  10730. "    ~mem.h     ~      Funciones de memoria."
  10731. "    ~process.h ~      Funciones de proceso."
  10732. "    ~share.h   ~      Constantes simbólicas utilizadas por sopen()."
  10733. "    ~sys\stat  ~      Información de ficheros."
  10734. "    ~sys\timeb ~      Hora actual."
  10735. "    ~sys\types ~      Definición de tipos."
  10736. "    ~values.h  ~      Constantes simbólicas para compatibilidad con UNIX."
  10737. endt
  10738. ""
  10739. "El resto de esta lección y las dos lecciones siguientes estarán"
  10740. "dedicadas a la descripción de cada fichero de cabecera.h."
  10741. ""
  10742. "Nota: las características ya estudiadas en lecciones anteriores no se"
  10743. "volverán a explicar (por ejemplo, ficheros stdarg.h y assert.h)."
  10744. ""
  10745. endvis
  10746. borrar_pantalla
  10747. beginv
  10748. centrar_coordenadas
  10749. cabecera " VALORES LIMITES "
  10750. color 15 3
  10751. ""
  10752. "  En el fichero de cabecera ~<limits.h>~  "
  10753. "  se encuentra una serie de macros que"
  10754. "  definen valores límites para algunos"
  10755. "  tipos de datos."
  10756. ""
  10757. endv
  10758. borrar_pantalla
  10759. beginvis
  10760. no_multiatributo
  10761. cabecera " FICHERO DE CABECERA LIMITS.H "
  10762. coordenadas_completas 1 2 80 24
  10763. color 0 3
  10764. borde 2
  10765. "CONSTANTES SIMBOLICAS:"
  10766. "**********************"
  10767. ""
  10768. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  10769. "  CHAR_xxx (#defines)"
  10770. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  10771. ""
  10772. "  CHAR_BIT   Tipo char, número de bits en un dato tipo cahr"
  10773. "  CHAR_MAX   Tipo char, mínimo valor"
  10774. "  CHAR_MIN   Tipo char, máximo valor"
  10775. ""
  10776. "Estos valores son independientes de si tipo char está definido como"
  10777. "signed o unsigned por defecto."
  10778. ""
  10779. "▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  10780. " INT_xxx (#defines)"
  10781. "▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  10782. ""
  10783. " INT_MAX   Tipo int, máximo valor"
  10784. " INT_MIN   Tipo int, mínimo valor"
  10785. ""
  10786. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  10787. "  LONG_xxx #defines"
  10788. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  10789. ""
  10790. "  LONG_MAX   Tipo long, máximo valor"
  10791. "  LONG_MIN   Tipo long, mínimo valor"
  10792. ""
  10793. "Máximo and mínimo valor para tipo long."
  10794. ""
  10795. "▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  10796. " SCHAR_xxx (#defines)"
  10797. "▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  10798. ""
  10799. " SCHAR_MAX   Tipo char, máximo valor"
  10800. " SCHAR_MIN   Tipo char, mínimo valor"
  10801. ""
  10802. "▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  10803. " SHRT_xxx (#defines)"
  10804. "▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  10805. ""
  10806. " SHRT_MAX   Tipo short, máximo valor"
  10807. " SHRT_MIN   Tipo short, mínimo valor"
  10808. ""
  10809. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  10810. "  UCHAR_MAX (#define)"
  10811. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  10812. ""
  10813. "Máximo valor para tipo unsigned char."
  10814. ""
  10815. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  10816. "  UINT_MAX (#define)"
  10817. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  10818. ""
  10819. "Máximo valor para tipo unsigned int."
  10820. ""
  10821. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  10822. "  ULONG_MAX (#define)"
  10823. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  10824. ""
  10825. "Máximo valor para tipo unsigned int."
  10826. ""
  10827. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  10828. "  USHRT_MAX (#define)"
  10829. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  10830. ""
  10831. "Máximo valor para tipo unsigned short."
  10832. ""
  10833. ""
  10834. "En el ejemplo 1 de esta lección se utilizan todas estas macros."
  10835. ""
  10836. endvis
  10837. beginv
  10838. color 15 3
  10839. cabecera " TIPOS Y MACROS ESTANDARES "
  10840. centrar_coordenadas
  10841. ""
  10842. " El estándar ANSI define unos"
  10843. " cuantos tipos estándares y ma-"
  10844. " cros en el fichero ~<stddef.h>~. "
  10845. ""
  10846. endv
  10847. borrar_pantalla
  10848. beginvis
  10849. no_multiatributo
  10850. cabecera " FICHERO DE CABECERA STDDEF.H "
  10851. coordenadas_completas 1 2 80 24
  10852. color 0 3
  10853. borde 2
  10854. ""
  10855. "El estándar ANSI define unos cuantos tipos estándares y macros en el"
  10856. "fichero stddef.h. Uno de los tipos es ptrdiff_t que es un tipo entero"
  10857. "con signo y el resultado de restar dos punteros. La macro size_t es el"
  10858. "tipo entero sin signo del resultado del operador de tiempo de compila-"
  10859. "ción sizeof. Las dos macros son NULL (que se corresponde con los pun-"
  10860. "teros nulos) y ERRNO (que se corresponde con el valor modificable uti-"
  10861. "lizado para guardar los diferentes códigos de error generados por las"
  10862. "funciones de biblioteca)."
  10863. ""
  10864. begint
  10865. "En Turbo C, la variable global errno sustituye a la macro ERRNO. Además"
  10866. "el fichero stddef.h incluye el fichero errno.h. En el fichero errno.h"
  10867. "se encuentran declaradas dos variables globales (errno y _doserrno) y"
  10868. "las definiciones de los números de error."
  10869. ""
  10870. endt
  10871. endvis
  10872. beginv
  10873. color 15 3
  10874. cabecera " FUNCIONES DE CARACTERES Y DE CADENAS "
  10875. centrar_coordenadas_x 2
  10876. "  La biblioteca estándar de C tiene un rico y variado conjunto   "
  10877. "  de funciones de manejo de ~caracteres~ y de ~cadenas~."
  10878. ""
  10879. pulsación
  10880. "  La utilización de las funciones de caracteres requieren la"
  10881. "  inclusión del fichero ~<ctype.h>~; y la utilización de las"
  10882. "  funciones de caracteres requieren la inclusión del fichero"
  10883. "  ~<string.h>~."
  10884. endv
  10885. beginv
  10886. centrar_coordenadas_x 12
  10887. "En C una cadena es un array de caracteres que finaliza con un"
  10888. "carácter nulo. Puesto que el C no tiene asociadas operaciones de"
  10889. "comprobación de cadenas, es responsabilidad del programador pro-"
  10890. "teger los arrays del desbordamiento. Si un array se desborda, el"
  10891. "comportamiento queda indefinido."
  10892. ""
  10893. pulsación
  10894. "Las funciones de caracteres toman un argumento entero, pero sólo"
  10895. "se utiliza el byte menos significativo. En general, nosotros so-"
  10896. "mos libres de utilizar un argumento de tipo carácter ya que auto-"
  10897. "máticamente se transforma en entero en el momento de la llamada."
  10898. endv
  10899. borrar_pantalla
  10900. beginvis
  10901. no_multiatributo
  10902. cabecera " FICHERO DE CABECERA CTYPE.H "
  10903. coordenadas_completas 1 2 80 24
  10904. color 0 3
  10905. borde 2
  10906. "▄▄▄▄▄"
  10907. "▌is*▐   Macros definidas en ctype.h"
  10908. "▀▀▀▀▀"
  10909. ""
  10910. "  Macro      │ Verdad (true) si c es..."
  10911. "═════════════╪════════════════════════════════════════════════════════════"
  10912. " isalnum(c)  │ Una letra o dígito"
  10913. " isalpha(c)  │ Una letra"
  10914. " isdigit(c)  │ Un dígito"
  10915. " iscntrl(c)  │ Un carácter de borrado o un carácter de control ordinario"
  10916. " isascii(c)  │ Un carácter ASCII válido"
  10917. " isprint(c)  │ Un carácter imprimible"
  10918. " isgraph(c)  │ Un carácter imprimible, excepto el carácter espacio"
  10919. " islower(c)  │ Una letra minúscula"
  10920. " isupper(c)  │ Una letra mayúscula"
  10921. " ispunct(c)  │ Un carácter de puntuación"
  10922. " isspace(c)  │ Un espacio, tabulador, retorno de carro, nueva línea,"
  10923. "             │ tabulación vertical, o alimentación de línea"
  10924. " isxdigit(c) │ Verdad si c es un dígito hexadecimal"
  10925. begint
  10926. "─────────────┼────────────────────────────────────────────────────────────"
  10927. " Macros de TC│ Convierte c ..."
  10928. "─────────────┼────────────────────────────────────────────────────────────"
  10929. " _toupper(c) │ En el rango [a-z] a caracteres [A-Z]"
  10930. " _tolower(c) │ En el rango [A-Z] a caracteres [a-z]"
  10931. " toascii(c)  │ Mayor de 127 al rango 0-127 poniendo todos los bits a cero"
  10932. "             │ excepto los 7 bits más significativos"
  10933. endt
  10934. ""
  10935. "▄▄▄▄▄"
  10936. "▌to*▐   Funciones declaradas en ctype.h"
  10937. "▀▀▀▀▀"
  10938. ""
  10939. "───────────────────────┼───────────────────────────"
  10940. " Prototipo             │ Qué hace"
  10941. "───────────────────────┼───────────────────────────"
  10942. " int toupper (int ch); │ Devuelve ch en mayúscula"
  10943. " int tolower (int ch); │ Devuelve ch en minúscula"
  10944. ""
  10945. ""
  10946. "¡¡¡OJO!!! Con las macros anteriores se debe evitar hacer operaciones como"
  10947. "las siguientes:"
  10948. ""
  10949. "  x = isdigit (getch ());"
  10950. "  y = isdigit (*p++);"
  10951. ""
  10952. "Supongamos que la macro isdigit() está definida así:"
  10953. ""
  10954. "#define isdigit(c) ((c) >= '0' && (c) <= '9')"
  10955. ""
  10956. "Entonces las dos asignaciones anteriores se expanderían a:"
  10957. ""
  10958. "  x = ((getch ()) >= '0' && (getch ()) <= '9')"
  10959. "  y = ((*p++) >= '0' && (*p++) <= '9')"
  10960. ""
  10961. "El error cometido se ve claramente: en el primer caso nuestra intención"
  10962. "era leer un sólo carácter y en realidad leemos dos, y en el segundo caso"
  10963. "nuestra intención era incrementar en uno el puntero p y en realidad lo"
  10964. "incrementamos en dos. Si isdigit() fuera una función en vez de una macro"
  10965. "no habría ningún problema."
  10966. ""
  10967. "En el ejemplo 1 de esta lección se muestra cómo usar estas macros y"
  10968. "estas funciones."
  10969. ""
  10970. endvis
  10971. beginvis
  10972. no_multiatributo
  10973. cabecera " FICHERO DE CABECERA STRING.H "
  10974. coordenadas_completas 1 2 80 24
  10975. color 0 3
  10976. borde 2
  10977. "NOTA: Ver observaciones al final de esta ventana"
  10978. ""
  10979. "GLOSARIO:"
  10980. ""
  10981. " ▄▄▄▄▄▄▄▄"
  10982. " ▌stpcpy▐   (TC) Copia un string en otro."
  10983. " ▀▀▀▀▀▀▀▀"
  10984. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  10985. " ▌strcat, _fstrcat▐   Añade fuente a destino."
  10986. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  10987. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  10988. " ▌strchr, _fstrchr▐   Encuentra c en s."
  10989. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  10990. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  10991. " ▌strcmp, _fstrcmp▐   Compara un string con otro."
  10992. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  10993. " ▄▄▄▄▄▄▄▄▄"
  10994. " ▌strcmpi▐   Macro que compara strings."
  10995. " ▀▀▀▀▀▀▀▀▀"
  10996. " ▄▄▄▄▄▄▄▄"
  10997. " ▌strcpy▐   Copia el string fuente al string destino."
  10998. " ▀▀▀▀▀▀▀▀"
  10999. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  11000. " ▌strcspn, _fstrcspn▐   Explora un string."
  11001. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  11002. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  11003. " ▌strdup, _fstrdup▐   (TC) Obtiene una copia duplicada de s, o copia s a"
  11004. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   una nueva localización."
  11005. " ▄▄▄▄▄▄▄▄▄▄▄"
  11006. " ▌_strerror▐   (TC) Construye un mensaje de error hecho a medida."
  11007. " ▀▀▀▀▀▀▀▀▀▀▀"
  11008. " ▄▄▄▄▄▄▄▄▄▄"
  11009. " ▌strerror▐   Devuelve un puntero al string que contiene el mensaje de error."
  11010. " ▀▀▀▀▀▀▀▀▀▀"
  11011. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  11012. " ▌stricmp, _fstricmp▐   (TC) Compara un string con otro ignorando el caso."
  11013. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  11014. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  11015. " ▌strlen, _fstrlen▐   Calcula la longitud de un string."
  11016. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  11017. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  11018. " ▌strlwr, _fstrlwr▐   (TC) Convierte s a caracteres en minúsculas."
  11019. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  11020. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  11021. " ▌strncat, _fstrncat▐   Añade como máximo longmax caracteres de fuente a"
  11022. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   destino."
  11023. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  11024. " ▌strncmp, _fstrncmp▐   Compara como mucho longmax caracteres de un string"
  11025. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   con otro."
  11026. " ▄▄▄▄▄▄▄▄▄▄"
  11027. " ▌strncmpi▐   (TC) Compara un trozo de un string con un trozo de otro,"
  11028. " ▀▀▀▀▀▀▀▀▀▀   sin sensibilidad al caso."
  11029. " ▄▄▄▄▄▄▄▄▄"
  11030. " ▌strcoll▐   Compara dos strings."
  11031. " ▀▀▀▀▀▀▀▀▀"
  11032. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  11033. " ▌strncpy, _fstrncpy▐   Copia como máximo longmax caracteres de fuente a"
  11034. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   destino."
  11035. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  11036. " ▌strnicmp, _fstrnicmp▐   (TC) Compara como máximo n caracteres de un string"
  11037. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   con otro, ignorando el caso."
  11038. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  11039. " ▌strnset, _fstrnset▐   (TC) Copia el carácter ch en las primeras n "
  11040. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   posiciones de s."
  11041. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  11042. " ▌strpbrk, _fstrpbrk▐   Explora un string."
  11043. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  11044. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  11045. " ▌strrchr, _fstrrchr▐   Encuentra la última ocurrencia de c en s."
  11046. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  11047. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  11048. " ▌strrev, _fstrrev▐   (TC) Invierte todos los caracteres de s (excepto el"
  11049. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   carácter terminador nulo)."
  11050. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  11051. " ▌strset, _fstrset▐   (TC) Copia el carácter ch a todas las posiciones de s."
  11052. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  11053. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  11054. " ▌strspn, _fstrspn▐   Explora un string para encontrar un segmento que es un"
  11055. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   subconjunto de un conjunto de caracteres."
  11056. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  11057. " ▌strstr, _fstrstr▐   Encuentra la primera ocurrencia de un substring en"
  11058. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   un string."
  11059. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  11060. " ▌strtok, _fstrtok▐   Explora s1 para encontrar el primer token no contenido"
  11061. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   en s2."
  11062. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  11063. " ▌strupr, _fstrupr▐   (TC) Convierte todos los caracteres de s a mayúsculas."
  11064. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  11065. " ▄▄▄▄▄▄▄▄▄"
  11066. " ▌strxfrm▐   (TC) Transforma un trozo de un string."
  11067. " ▀▀▀▀▀▀▀▀▀"
  11068. ""
  11069. ""
  11070. "ESTUDIO DE LAS FUNCIONES DEL GLOSARIO:"
  11071. ""
  11072. " ▄▄▄▄▄▄▄▄"
  11073. " ▌stpcpy▐   (TC) Copia un string en otro."
  11074. " ▀▀▀▀▀▀▀▀"
  11075. ""
  11076. " Sintaxis:"
  11077. "   char *stpcpy (char *destino, const char *fuente);"
  11078. ""
  11079. "Es igual que strcpy(), excepto que stpcpy devuelve"
  11080. ""
  11081. "  destino + strlen (fuente)."
  11082. ""
  11083. "Ejemplo:"
  11084. ""
  11085. " #include <string.h>"
  11086. " #include <stdio.h>"
  11087. ""
  11088. " void main (void)"
  11089. " {"
  11090. "   char s1[10];"
  11091. "   char *s2 = "abc";"
  11092. ""
  11093. "   printf ("%s", stpcpy (s1, s2) - 2); /* s1 contiene «abc» e imprime «bc» */"
  11094. " }"
  11095. ""
  11096. ""
  11097. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  11098. " ▌strcat, _fstrcat▐   Añade fuente a destino."
  11099. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  11100. ""
  11101. " Sintaxis:"
  11102. "  Near: char *strcat (char *destino, const char *fuente);"
  11103. "  Far:  char far * far _fstrcat (char far *destino, const char far *fuente);"
  11104. ""
  11105. "Devuelve destino."
  11106. ""
  11107. "Ejemplo:"
  11108. ""
  11109. " #include <stdio.h>"
  11110. " #include <string.h>"
  11111. ""
  11112. " void main (void)"
  11113. " {"
  11114. "   char s1[10] = "a";"
  11115. "   char *s2 = "bc";"
  11116. ""
  11117. "   printf ("%s", strcat (s1, s2)); /* s1 contiene «abc» e imprime «abc» */"
  11118. " }"
  11119. ""
  11120. ""
  11121. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  11122. " ▌strchr, _fstrchr▐   Encuentra c en s."
  11123. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  11124. ""
  11125. " Sintaxis:"
  11126. "  Near: char *strchr (const char *s, int c);"
  11127. "  Far:  char far * far _fstrchr (const char far *s, int c);"
  11128. ""
  11129. "Devuelve un puntero a la primera ocurrencia del carácter c en s; si c no"
  11130. "aparece en s, strchr() devuelve NULL."
  11131. ""
  11132. "Ejemplo:"
  11133. ""
  11134. " #include <stdio.h>"
  11135. " #include <string.h>"
  11136. ""
  11137. " void main (void)"
  11138. " {"
  11139. "   char *s = "abc";"
  11140. "   char c1 = 'b', c2 = 'd';"
  11141. ""
  11142. "   printf ("%s", strchr (s, c1)); /* imprime «bc» */"
  11143. "   printf ("%s", strchr (s, c2)); /* imprime «(null)» */"
  11144. " }"
  11145. ""
  11146. ""
  11147. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  11148. " ▌strcmp, _fstrcmp▐   Compara un string con otro."
  11149. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  11150. ""
  11151. " Sintaxis:"
  11152. "   int strcmp (const char *s1, const char *s2);"
  11153. "   int far _fstrcmp (const char far *s1, const char far *s2);"
  11154. ""
  11155. "Devuelve uno de los valores siguientes:"
  11156. ""
  11157. "  < 0 si s1 es menor que s2"
  11158. " == 0 si s1 es igual que s2"
  11159. "  > 0 si s1 es mayor que s2"
  11160. ""
  11161. "Ejecuta una comparación con signo."
  11162. ""
  11163. "Ejemplo:"
  11164. ""
  11165. " #include <stdio.h>"
  11166. " #include <string.h>"
  11167. ""
  11168. " void main (void)"
  11169. " {"
  11170. "   char *s1 = "a";"
  11171. "   char *s2 = "bc";"
  11172. ""
  11173. "   printf ("%d", strcmp (s1, s2)); /* imprime «-1» */"
  11174. "   printf ("%d", strcmp (s2, s1)); /* imprime «1» */"
  11175. " }"
  11176. ""
  11177. ""
  11178. " ▄▄▄▄▄▄▄▄▄"
  11179. " ▌strcmpi▐   Macro que compara strings."
  11180. " ▀▀▀▀▀▀▀▀▀"
  11181. ""
  11182. " Sintaxis:"
  11183. "   int strcmpi (const char *s1, const char *s2);"
  11184. ""
  11185. "Esta rutina está implementada como una macro para compatibilidad con"
  11186. "otros compiladores. Es igual que stricmp()."
  11187. ""
  11188. "Ejemplo:"
  11189. ""
  11190. " #include <stdio.h>"
  11191. " #include <string.h>"
  11192. ""
  11193. " void main (void)"
  11194. " {"
  11195. "   char *s1 = "aaa";"
  11196. "   char *s2 = "AAA";"
  11197. ""
  11198. "   printf ("%d", strcmpi (s1, s2)); /* imprime «0» */"
  11199. " }"
  11200. ""
  11201. ""
  11202. " ▄▄▄▄▄▄▄▄▄"
  11203. " ▌strcoll▐   Compara dos strings."
  11204. " ▀▀▀▀▀▀▀▀▀"
  11205. ""
  11206. " Sintaxis:"
  11207. "   int strcoll (char *s1, char *s2);"
  11208. ""
  11209. "La función strcoll() compara el string apuntado por s1 con el string"
  11210. "apuntado por s2, según los valores puestos por setlocale()."
  11211. ""
  11212. "Ejemplo:"
  11213. ""
  11214. " #include <stdio.h>"
  11215. " #include <string.h>"
  11216. ""
  11217. " void main (void)"
  11218. " {"
  11219. "   char *s1 = "a";"
  11220. "   char *s2 = "bc";"
  11221. ""
  11222. "   printf ("%d", strcoll (s1, s2)); /* imprime «-1» */"
  11223. "   printf ("%d", strcoll (s2, s1)); /* imprime «1» */"
  11224. " }"
  11225. ""
  11226. ""
  11227. " ▄▄▄▄▄▄▄▄"
  11228. " ▌strcpy▐   Copia el string fuente al string destino."
  11229. " ▀▀▀▀▀▀▀▀"
  11230. ""
  11231. " Sintaxis:"
  11232. "   char *strcpy (char *destino, const char *fuente);"
  11233. ""
  11234. "Devuelve destino."
  11235. ""
  11236. "Ejemplo:"
  11237. ""
  11238. " #include <stdio.h>"
  11239. " #include <string.h>"
  11240. ""
  11241. " void main (void)"
  11242. " {"
  11243. "   char s1[10] = "def";"
  11244. "   char *s2 = "abc";"
  11245. ""
  11246. "   printf ("%s", strcpy (s1, s2)); /* s1 contiene «abc» e imprime «abc» */"
  11247. " }"
  11248. ""
  11249. ""
  11250. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  11251. " ▌strcspn, _fstrcspn▐   Explora un string."
  11252. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  11253. ""
  11254. " Sintaxis:"
  11255. "  Near: size_t strcspn (const char *s1, const char *s2);"
  11256. "  Far:  size_t far far _fstrcspn (const char far *s1, const char far *s2);"
  11257. ""
  11258. "Devuelve la longitud del substring inicial apuntado por s1 que está"
  11259. "constituido sólo por aquellos caracteres que no están contenidos en el"
  11260. "string 2. Dicho de otra forma, strcspn() devuelve el índice el primer"
  11261. "carácter en el string apuntado por s1 que está como carácter del string"
  11262. "apuntado por s2."
  11263. ""
  11264. "Ejemplo:"
  11265. ""
  11266. " #include <stdio.h>"
  11267. " #include <string.h>"
  11268. ""
  11269. " void main (void)"
  11270. " {"
  11271. "   char *s1 = "defdb";"
  11272. "   char *s2 = "abc";"
  11273. ""
  11274. "   printf ("%d", strcspn (s1, s2)); /* imprime «4» */"
  11275. " }"
  11276. ""
  11277. ""
  11278. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  11279. " ▌strdup, _fstrdup▐   (TC) Obtiene una copia duplicada de s, o copia s a"
  11280. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   una nueva localización."
  11281. ""
  11282. " Sintaxis:"
  11283. "  Near: char *strdup (const char *s);"
  11284. "  Far:  char far * far _fstrdup (const char far *s);"
  11285. ""
  11286. "Devuelve un puntero a la copia duplicada de s, o devuelve NULL si no hubo"
  11287. "espacio suficiente para la asignación de la copia. El programador es res-"
  11288. "ponsable de liberar el espacio asignado por strdup() cuando ya no sea ne-"
  11289. "cesario."
  11290. ""
  11291. "Ejemplo:"
  11292. ""
  11293. " #include <stdio.h>"
  11294. " #include <string.h>"
  11295. " #include <alloc.h>"
  11296. ""
  11297. " void main (void)"
  11298. " {"
  11299. "   char *s1;"
  11300. "   char *s2 = "abc";"
  11301. ""
  11302. "   if ((s1 = strdup (s2)) != NULL)"
  11303. "     {"
  11304. "       printf ("%s", s1); /* imprime «abc» */"
  11305. "       free (s1);"
  11306. "     }"
  11307. " }"
  11308. ""
  11309. ""
  11310. " ▄▄▄▄▄▄▄▄▄▄▄"
  11311. " ▌_strerror▐   (TC) Construye un mensaje de error hecho a medida."
  11312. " ▀▀▀▀▀▀▀▀▀▀▀"
  11313. ""
  11314. " Sintaxis:"
  11315. "   char *_strerror (const char *s);"
  11316. ""
  11317. "El mensaje de error está constituido por s, dos puntos, un espacio, el"
  11318. "mensaje de error más reciente generado por el sistema, y un carácter de"
  11319. "nueva línea."
  11320. ""
  11321. "El string s debe tener 94 caracteres o menos."
  11322. ""
  11323. "Devuelve un puntero al string que contiene el mensaje de error."
  11324. ""
  11325. "Ejemplo:"
  11326. ""
  11327. " #include <stdio.h>"
  11328. " #include <string.h>"
  11329. ""
  11330. " void main (void)"
  11331. " {"
  11332. "   printf ("%s", _strerror ("Prueba")); /* imprime «Prueba: Error 0» */"
  11333. " } /* la impresión descrita puede variar entre distintas implementaciones */"
  11334. ""
  11335. ""
  11336. " ▄▄▄▄▄▄▄▄▄▄"
  11337. " ▌strerror▐   Devuelve un puntero al string que contiene el mensaje de error."
  11338. " ▀▀▀▀▀▀▀▀▀▀"
  11339. ""
  11340. " Sintaxis:"
  11341. "   char *strerror (int numerr);"
  11342. ""
  11343. "Devuelve un puntero al mensaje de error asociado con numerr."
  11344. ""
  11345. "Ejemplo:"
  11346. ""
  11347. " #include <stdio.h>"
  11348. " #include <string.h>"
  11349. ""
  11350. " void main (void)"
  11351. " {"
  11352. "   printf ("%s", strerror (3)); /* imprime «Path not found» */"
  11353. " } /* la impresión descrita puede variar entre distintas implementaciones */"
  11354. ""
  11355. ""
  11356. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  11357. " ▌stricmp, _fstricmp▐   (TC) Compara un string con otro ignorando el caso."
  11358. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  11359. ""
  11360. " Sintaxis:"
  11361. "  Near: int stricmp (const char *s1, const char *s2);"
  11362. "  Far:  int far _fstrcmp (const char far *s1, const char far *s2);"
  11363. ""
  11364. "Devuelve uno de los siguientes valores:"
  11365. ""
  11366. "   < 0 si s1 es menor que s2"
  11367. "  == 0 si s1 es igual que s2"
  11368. "   > 0 si s1 es mayor que s2"
  11369. ""
  11370. "Ejecuta una comparación con signo."
  11371. ""
  11372. "La macro strcmpi(), definida en string.h, es equivalente a stricmp()."
  11373. ""
  11374. "Ejemplo:"
  11375. ""
  11376. " #include <stdio.h>"
  11377. " #include <string.h>"
  11378. ""
  11379. " void main (void)"
  11380. " {"
  11381. "   char *s1 = "aaa";"
  11382. "   char *s2 = "AAA";"
  11383. ""
  11384. "   printf ("%d", strcmpi (s1, s2)); /* imprime «0» */"
  11385. " }"
  11386. ""
  11387. ""
  11388. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  11389. " ▌strlen, _fstrlen▐   Calcula la longitud de un string."
  11390. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  11391. ""
  11392. " Sintaxis:"
  11393. "  Near: size_t strlen (const char *s);"
  11394. "  Far: size_t _fstrlen (const char far *s);"
  11395. ""
  11396. "Devuelve el número de caracteres que hay en s, no contando el carácter"
  11397. "terminador nulo."
  11398. ""
  11399. "Ejemplo:"
  11400. ""
  11401. " #include <stdio.h>"
  11402. " #include <string.h>"
  11403. ""
  11404. " void main (void)"
  11405. " {"
  11406. "   char s[10] = "abc";"
  11407. ""
  11408. "   printf ("%d", strlen (s)); /* imprime «3» */"
  11409. "   printf ("%d", sizeof (s)); /* imprime «10» */"
  11410. " }"
  11411. ""
  11412. ""
  11413. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  11414. " ▌strlwr, _fstrlwr▐   (TC) Convierte s a caracteres en minúsculas."
  11415. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  11416. ""
  11417. " Sintaxis:"
  11418. "  Near: char *strlwr (char *s);"
  11419. "  Far:  char far * far _fstrlwr (char char far *s);"
  11420. ""
  11421. "Devuelve un puntero a s."
  11422. ""
  11423. "Ejemplo:"
  11424. ""
  11425. " #include <stdio.h>"
  11426. " #include <string.h>"
  11427. ""
  11428. " void main (void)"
  11429. " {"
  11430. "   char *s = "AbC";"
  11431. ""
  11432. "   printf ("%s", strlwr (s)); /* imprime «abc» */"
  11433. " }"
  11434. ""
  11435. ""
  11436. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  11437. " ▌strncat, _fstrncat▐   Añade como máximo longmax caracteres de fuente a"
  11438. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   destino."
  11439. ""
  11440. " Sintaxis:"
  11441. "  Near: char *strncat (char *destino, const char *fuente, size_t longmax);"
  11442. "  Far:  char far * far _fstrncat (char far *destino, const char far *fuente,"
  11443. "                                  size_t longmax);"
  11444. ""
  11445. "Devuelve destino."
  11446. ""
  11447. "Ejemplo:"
  11448. ""
  11449. " #include <stdio.h>"
  11450. " #include <string.h>"
  11451. ""
  11452. " void main (void)"
  11453. " {"
  11454. "   char s1[10];"
  11455. "   char *s2 = "bcdef";"
  11456. "   int n1 = 2;"
  11457. "   int n2 = 10;"
  11458. ""
  11459. "   strcpy (s1, "a");"
  11460. "   printf ("%s", strncat (s1, s2, n1)); /* imprime «abc» */"
  11461. "   strcpy (s1, "a");"
  11462. "   printf ("%s", strncat (s1, s2, n2)); /* imprime «abcdef» */"
  11463. " }"
  11464. ""
  11465. ""
  11466. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  11467. " ▌strncmp, _fstrncmp▐   Compara como mucho longmax caracteres de un string"
  11468. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   con otro."
  11469. ""
  11470. " Sintaxis:"
  11471. "  Near: int strncmp (const char *s1, const char *s2, size_t longmax);"
  11472. "  Far:  int far _fstrncmp (const char far *s1, const char far *s2,"
  11473. "                           size_t longmax);"
  11474. ""
  11475. "Devuelve uno de los siguientes valores:"
  11476. ""
  11477. "  < 0 si s1 es menor que s2"
  11478. " == 0 si s1 es igual que s2"
  11479. "  > 0 si s1 es mayor que s2"
  11480. ""
  11481. "Ejecuta una comparación con signo."
  11482. ""
  11483. "Ejemplo:"
  11484. ""
  11485. " #include <stdio.h>"
  11486. " #include <string.h>"
  11487. ""
  11488. " void main (void)"
  11489. " {"
  11490. "   char *s1 = "aaa";"
  11491. "   char *s2 = "aab";"
  11492. "   int n1 = 2;"
  11493. "   int n2 = 5;"
  11494. ""
  11495. "   printf ("%d", strncmp (s1, s2, n1)); /* imprime «0» */"
  11496. "   printf ("%d", strncmp (s1, s2, n2)); /* imprime «-1» */"
  11497. " }"
  11498. ""
  11499. ""
  11500. " ▄▄▄▄▄▄▄▄▄▄"
  11501. " ▌strncmpi▐   (TC) Compara un trozo de un string con un trozo de otro,"
  11502. " ▀▀▀▀▀▀▀▀▀▀   sin sensibilidad al caso."
  11503. ""
  11504. " Sintaxis:"
  11505. "   int strncmpi (const char *s1, const char *s2, size_t n);"
  11506. ""
  11507. "La función strncmpi() ejecuta una comparación con signo entre s1 y s2, para"
  11508. "una longitud máxima de n bytes, empezando con el primer carácter de cada"
  11509. "string y continuando con los caracteres siguientes hasta encontrar carac-"
  11510. "teres correspondientes diferentes o hasta que se han examinado n caracteres."
  11511. ""
  11512. "Devuelve un valor (<0, 0, o >0) basado en el resultado de la comparación"
  11513. "de s1 (o parte de él) con s2 (o parte de él)."
  11514. ""
  11515. "Ejemplo:"
  11516. ""
  11517. " #include <stdio.h>"
  11518. " #include <string.h>"
  11519. ""
  11520. " void main (void)"
  11521. " {"
  11522. "   char *s1 = "aaa";"
  11523. "   char *s2 = "AAb";"
  11524. "   int n1 = 2;"
  11525. "   int n2 = 5;"
  11526. ""
  11527. "   printf ("%d", strncmpi (s1, s2, n1)); /* imprime «0» */"
  11528. "   printf ("%d", strncmpi (s1, s2, n2)); /* imprime «-1» */"
  11529. " }"
  11530. ""
  11531. ""
  11532. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  11533. " ▌strncpy, _fstrncpy▐   Copia como máximo longmax caracteres de fuente a"
  11534. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   destino."
  11535. ""
  11536. " Sintaxis:"
  11537. "  Near: char *strncpy (char *destino, const char *fuente, size_t longmax);"
  11538. "  Far:  char far * far _fstrncpy (char far *destino, const char far *fuente,"
  11539. "                                  size_t longmax)"
  11540. ""
  11541. "Si son copiados longmax caracteres, no es añadido el carácter nulo; por lo"
  11542. "tanto, el contenido de destino no es un string terminado en nulo."
  11543. ""
  11544. "Devuelve destino."
  11545. ""
  11546. "Ejemplo:"
  11547. ""
  11548. " #include <stdio.h>"
  11549. " #include <string.h>"
  11550. ""
  11551. " void main (void)"
  11552. " {"
  11553. "   char s1[10];"
  11554. "   char *s2 = "abcd";"
  11555. "   int n1 = 2;"
  11556. "   int n2 = 10;"
  11557. ""
  11558. "   printf ("%s", (strncpy (s1, s2, n1), *(s1+n1) = 0, s1)); /*imprime «ab»*/"
  11559. "   printf ("%s", strncpy (s1, s2, n2)); /* imprime «abcd» */"
  11560. " }"
  11561. ""
  11562. ""
  11563. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  11564. " ▌strnicmp, _fstrnicmp▐   (TC) Compara como máximo n caracteres de un string"
  11565. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   con otro, ignorando el caso."
  11566. ""
  11567. " Sintaxis:"
  11568. "  Near: int strnicmp (const char *s1, const char *s2, size_t longmax);"
  11569. "  Far:  int far _fstrnicmp (const char far *s1, const char far *s2,"
  11570. "                            size_t longmax);"
  11571. ""
  11572. "Devuelve uno de los siguientes valores:"
  11573. ""
  11574. "   < 0 si s1 es menor que s2"
  11575. "  == 0 si s1 es igual que s2"
  11576. "   > 0 si s1 es mayor que s2"
  11577. ""
  11578. "Ejecuta comparación con signo."
  11579. ""
  11580. "La macro strncmpi(), definida en string.h, es equivalente a strnicmp()."
  11581. ""
  11582. "Ejemplo:"
  11583. ""
  11584. " #include <stdio.h>"
  11585. " #include <string.h>"
  11586. ""
  11587. " void main (void)"
  11588. " {"
  11589. "   char *s1 = "aaa";"
  11590. "   char *s2 = "AAb";"
  11591. "   int n1 = 2;"
  11592. "   int n2 = 5;"
  11593. ""
  11594. "   printf ("%d", strnicmp (s1, s2, n1)); /* imprime «0» */"
  11595. "   printf ("%d", strnicmp (s1, s2, n2)); /* imprime «-1» */"
  11596. " }"
  11597. ""
  11598. ""
  11599. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  11600. " ▌strnset, _fstrnset▐   (TC) Copia el carácter ch en las primeras n "
  11601. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   posiciones de s."
  11602. ""
  11603. " Sintaxis:"
  11604. "  Near: char *strnset (int *s, int ch, size_t n);"
  11605. "  Far:  char far * far _fstrnset (char far *s, int ch, size_t n);"
  11606. ""
  11607. "Se para cuando los n caracteres son copiados o se encuentra NULL. Devuelve"
  11608. "un puntero a s."
  11609. ""
  11610. "Ejemplo:"
  11611. """
  11612. " #include <stdio.h>"
  11613. " #include <string.h>"
  11614. ""
  11615. " void main (void)"
  11616. " {"
  11617. "   char s[10] = "abc";"
  11618. "   char c1 = 'x';"
  11619. "   char c2 = 'y';"
  11620. "   int n1 = 10;"
  11621. "   int n2 = 2;"
  11622. ""
  11623. "   printf ("%s", strnset (s, c1, n1)); /* s contiene «xxx» e imprime «xxx» */"
  11624. "   printf ("%s", strnset (s, c2, n2)); /* s contiene «yyx» e imprime «yyx» */"
  11625. " }"
  11626. ""
  11627. ""
  11628. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  11629. " ▌strpbrk, _fstrpbrk▐   Explora un string."
  11630. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  11631. ""
  11632. " Sintaxis:"
  11633. "  Near: char *strpbrk (const char *s1, const char *s2);"
  11634. "  Far:  char far * far _fstrpbrk (const char far *s1, const char far *s2);"
  11635. ""
  11636. "Devuelve un puntero al primer carácter del string apuntado por s1 que se"
  11637. "corresponde con algún carácter en el string apuntado por s2. El carácter"
  11638. "nulo de terminación no se incluye. Si no hay correspondencia, se devuelve"
  11639. "un puntero nulo."
  11640. ""
  11641. "Ejemplo:"
  11642. ""
  11643. " #include <stdio.h>"
  11644. " #include <string.h>"
  11645. ""
  11646. " void main (void)"
  11647. " {"
  11648. "   char *s1 = "abc";"
  11649. "   char *s2 = "de";"
  11650. "   char *s3 = "db";"
  11651. ""
  11652. "   printf ("%s", strpbrk (s1, s2)); /* imprime «(null)» */"
  11653. "   printf ("%s", strpbrk (s1, s3)); /* imprime «bc» */"
  11654. " }"
  11655. ""
  11656. ""
  11657. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  11658. " ▌strrchr, _fstrrchr▐   Encuentra la última ocurrencia de c en s."
  11659. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  11660. ""
  11661. " Sintaxis:"
  11662. "  Near: char *strrchr (const char *s, int c);"
  11663. "  Far:  char far * far _fstrrchr (const char far *s, int c);"
  11664. ""
  11665. "Devuelve un puntero a la última ocurrencia del carácter c, o NULL si c"
  11666. "no aparece en s."
  11667. ""
  11668. "Ejemplo:"
  11669. ""
  11670. " #include <stdio.h>"
  11671. " #include <string.h>"
  11672. ""
  11673. " void main (void)"
  11674. " {"
  11675. "   char *s = "abcabc";"
  11676. "   char c1 = 'b', c2 = 'd';"
  11677. ""
  11678. "   printf ("%s", strrchr (s, c1)); /* imprime «bc» */"
  11679. "   printf ("%s", strrchr (s, c2)); /* imprime «(null)» */"
  11680. " }"
  11681. ""
  11682. ""
  11683. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  11684. " ▌strrev, _fstrrev▐   (TC) Invierte todos los caracteres de s (excepto el"
  11685. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   carácter terminador nulo)."
  11686. ""
  11687. " Sintaxis:"
  11688. "  Near: char *strrev (char *s);"
  11689. "  Far:  char far * far _fstrrev (char far *s);"
  11690. ""
  11691. "Devuelve un puntero al string invertido."
  11692. ""
  11693. "Ejemplo:"
  11694. ""
  11695. " #include <stdio.h>"
  11696. " #include <string.h>"
  11697. ""
  11698. " void main (void)"
  11699. " {"
  11700. "   char *s = "abc";"
  11701. ""
  11702. "   printf ("%s", strrev (s)); /* imprime «cba» */"
  11703. " }"
  11704. ""
  11705. ""
  11706. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  11707. " ▌strset, _fstrset▐   (TC) Copia el carácter ch a todas las posiciones de s."
  11708. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  11709. ""
  11710. " Sintaxis:"
  11711. "  Near: char *strset (char *s, int ch);"
  11712. "  Far:  char far * far _fstrset (char far *s, int ch);"
  11713. ""
  11714. "Termina cuando se encuentra el primer carácter nulo."
  11715. ""
  11716. "Devuelve un puntero a s."
  11717. ""
  11718. "Ejemplo:"
  11719. ""
  11720. " #include <stdio.h>"
  11721. " #include <string.h>"
  11722. ""
  11723. " void main (void)"
  11724. " {"
  11725. "   char s[10] = "abcd";"
  11726. "   char c = 'z';"
  11727. ""
  11728. "   printf ("%s", strset (s, c)); /* s contiene «zzzz» e imprime «zzzz» */"
  11729. " }"
  11730. ""
  11731. ""
  11732. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  11733. " ▌strspn, _fstrspn▐   Explora un string para encontrar un segmento que es un"
  11734. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   subconjunto de un conjunto de caracteres."
  11735. ""
  11736. " Sintaxis:"
  11737. "  Near: size_t strspn (const char *s1, const char *s2);"
  11738. "  Far:  size_t far _fstrspn (const char far *s1, const char far *s2);"
  11739. ""
  11740. "Devuelve la longitud del substring inicial del string apuntado por s1"
  11741. "que está constituido sólo por aquellos caracteres contenidos en el"
  11742. "string apuntado por s2. Dicho de otra forma, strspn() devuelve el índice"
  11743. "del primer carácter en el string apuntado por s1 que no se corresponde"
  11744. "con ningún carácter del string apuntado por s2."
  11745. ""
  11746. "Ejemplo:"
  11747. ""
  11748. " #include <stdio.h>"
  11749. " #include <string.h>"
  11750. ""
  11751. " void main (void)"
  11752. " {"
  11753. "   char *s1 = "acbbad";"
  11754. "   char *s2 = "abc";"
  11755. ""
  11756. "   printf ("%d", strspn (s1, s2)); /* imprime «5» */"
  11757. " }"
  11758. ""
  11759. ""
  11760. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  11761. " ▌strstr, _fstrstr▐   Encuentra la primera ocurrencia de un substring en"
  11762. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   un string."
  11763. ""
  11764. " Sintaxis:"
  11765. "  Near: char *strstr (const char *s1, const char *s2);"
  11766. "  Far:  char far * far _fstrstr (const char far *s1, const char far *s2);"
  11767. ""
  11768. "Devuelve un puntero a la primera ocurrencia en la cadena apuntada por s1"
  11769. "de la cadena apuntada por s2 (excepto el carácter nulo de terminación de"
  11770. "s2). Devuelve un puntero nulo si no se encuentra."
  11771. ""
  11772. "Ejemplo:"
  11773. ""
  11774. " #include <stdio.h>"
  11775. " #include <string.h>"
  11776. ""
  11777. " void main (void)"
  11778. " {"
  11779. "   char *s1 = "abcdef";"
  11780. "   char *s2 = "cd";"
  11781. "   char *s3 = "cdg";"
  11782. ""
  11783. "   printf ("%s", strstr (s1, s2)); /* imprime «cdef» */"
  11784. "   printf ("%s", strstr (s1, s3)); /* imprime «(null)» */"
  11785. " }"
  11786. ""
  11787. ""
  11788. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  11789. " ▌strtok, _fstrtok▐   Explora s1 para encontrar el primer token no contenido"
  11790. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   en s2."
  11791. ""
  11792. " Sintaxis:"
  11793. "  Near: char *strtok (char *s1, const char *s2);"
  11794. "  Far:  char far * far _fstrtok (char far *s1, const char far *s2);"
  11795. ""
  11796. "s2 define caracteres separadores; strtok() interpreta el string s1 como"
  11797. "una serie de tokens separados por los caracteres separadores que hay en s2."
  11798. ""
  11799. "Si no se encuentra ningún token en s1, strtok() devuelve NULL."
  11800. ""
  11801. "Si se encuentra un token, se pone un carácter nulo en s1 siguiendo al"
  11802. "token, y strtok() devuelve un puntero al token."
  11803. ""
  11804. "En las llamadas siguientes a strtok() con NULL como primer argumento, usa"
  11805. "el string previo s1, empezando después del último token encontrado."
  11806. ""
  11807. "Nótese que la cadena inicial es, por tanto, destruida."
  11808. ""
  11809. "Ejemplo:"
  11810. ""
  11811. " #include <stdio.h>"
  11812. " #include <string.h>"
  11813. ""
  11814. " void main (void)"
  11815. " {"
  11816. "   char *s1 = "ab cd, e; fg,h:ijk.";"
  11817. "   char *s2 = " ,;:.";"
  11818. "   char *p;"
  11819. ""
  11820. "   p = strtok (s1, s2);"
  11821. "   while (p)"
  11822. "     {"
  11823. "       printf (p);"
  11824. "       p = strtok (NULL, s2);"
  11825. "     }"
  11826. "   /* el bucle while imprime: «abcdefghijk» */"
  11827. " }"
  11828. ""
  11829. ""
  11830. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  11831. " ▌strupr, _fstrupr▐   (TC) Convierte todos los caracteres de s a mayúsculas."
  11832. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  11833. ""
  11834. " Sintaxis:"
  11835. "  Near: char *strupr (char *s);"
  11836. "  Far:  char far * far _fstrupr (char far *s);"
  11837. ""
  11838. "Devuelve un puntero a s."
  11839. ""
  11840. "Ejemplo:"
  11841. ""
  11842. " #include <stdio.h>"
  11843. " #include <string.h>"
  11844. ""
  11845. " void main (void)"
  11846. " {"
  11847. "   char *s = "aBc";"
  11848. ""
  11849. "   printf ("%s", strupr (s)); /* imprime «ABC» */"
  11850. " }"
  11851. ""
  11852. ""
  11853. " ▄▄▄▄▄▄▄▄▄"
  11854. " ▌strxfrm▐   (TC) Transforma un trozo de un string."
  11855. " ▀▀▀▀▀▀▀▀▀"
  11856. ""
  11857. " Sintaxis:"
  11858. "   size_t strxfrm (char *s1, char *s2, size_t n);"
  11859. ""
  11860. "Es equivalente a strncpy()."
  11861. ""
  11862. "Ejemplo:"
  11863. ""
  11864. " #include <stdio.h>"
  11865. " #include <string.h>"
  11866. ""
  11867. " void main (void)"
  11868. " {"
  11869. "   char s1[10];"
  11870. "   char *s2 = "abcdefg";"
  11871. "   printf ("\n%d ", strxfrm (s1, s2, 10)); /* s1 contiene «abcdefg»"
  11872. "                                              e imprime «7» */"
  11873. " }"
  11874. ""
  11875. ""
  11876. "OBSERVACIONES:"
  11877. ""
  11878. "  1) Aquellas funciones que tienen al principio de la descripción: (TC)"
  11879. "  no están en el ANSI C y sí en TURBO C. Asimismo, la distinción entre"
  11880. "  funciones near y far no está en el ANSI, sino que también es propio"
  11881. "  de TURBO C: el prototipo de near en aquellas funciones que no tienen"
  11882. "  (TC) es el prototipo de la función en el ANSI. No obstante, aquellos"
  11883. "  usuarios que tengan la opción turbo a off, verán todas las funciones"
  11884. "  ya que muchas de estas funciones que no pertenecen al ANSI C están en"
  11885. "  muchos compiladores y además así tienen una visión más amplia de la"
  11886. "  variedad de operaciones que se pueden hacer con los strings (llamados"
  11887. "  en castellano cadenas)."
  11888. ""
  11889. "  2) Las funciones memccpy(), memchr(), memcmp(), memcpy(), memicmp(),"
  11890. "  memmove(), memset(), movedata(), movmem() y setmem() están declaradas"
  11891. "  en Turbo C en los ficheros string.h y mem.h. De entre las funciones"
  11892. "  anteriores, pertenecen al ANSI las funciones memchr(), memcmp(),"
  11893. "  memcpy() y memset(), entre todas éstas, la función memchr() está"
  11894. "  declarada en el ANSI en el fichero ctype.h y el resto en string.h."
  11895. "  Estas funciones las estudiarán en la ventana siguiente los usuarios"
  11896. "  que tengan activada la opción de turbo puesta a on; los que tengan"
  11897. "  la opción de turbo a off no la estudiarán porque en realidad son"
  11898. "  superfluas: todo lo que se puede hacer con ellas, se puede hacer"
  11899. "  con las funciones de cadenas."
  11900. ""
  11901. endvis
  11902. begint
  11903. beginvis
  11904. no_multiatributo
  11905. cabecera " FICHERO DE CABECERA MEM.H "
  11906. coordenadas_completas 1 2 80 24
  11907. color 0 3
  11908. borde 2
  11909. "GLOSARIO:"
  11910. ""
  11911. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  11912. " ▌memccpy, _fmemccpy▐   Copia un bloque de n bytes de fuente a destino."
  11913. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  11914. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  11915. " ▌memchr, _fmemchr▐  Busca el carácter c en los primeros n bytes del array s."
  11916. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  11917. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  11918. " ▌memcmp, _fmemcmp▐   Compara dos strings, s1 y s2, para una longitud de"
  11919. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   n bytes exactamente."
  11920. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  11921. " ▌memcpy, _fmemcpy▐   Copia un bloque de n bytes de fuente a destino."
  11922. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  11923. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  11924. " ▌memicmp, _fmemicmp▐   Compara los primeros n bytes de s1 y s2, ignorando"
  11925. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   el caso."
  11926. " ▄▄▄▄▄▄▄▄▄"
  11927. " ▌memmove▐   Copia un bloque de n bytes de fuente a destino."
  11928. " ▀▀▀▀▀▀▀▀▀"
  11929. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  11930. " ▌memset, _fmemset▐   Copia n veces el byte c en s."
  11931. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  11932. " ▄▄▄▄▄▄▄▄▄▄"
  11933. " ▌movedata▐   Copia n bytes."
  11934. " ▀▀▀▀▀▀▀▀▀▀"
  11935. " ▄▄▄▄▄▄▄▄"
  11936. " ▌movmem▐   Mueve un bloque de longitud bytes de fuente a destino."
  11937. " ▀▀▀▀▀▀▀▀"
  11938. " ▄▄▄▄▄▄▄▄"
  11939. " ▌setmem▐   Asigna un valor a un rango de memoria."
  11940. " ▀▀▀▀▀▀▀▀"
  11941. ""
  11942. ""
  11943. "DESCRIPCION DE LAS FUNCIONES QUE APARECEN EN EL GLOSARIO:"
  11944. ""
  11945. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  11946. " ▌memccpy, _fmemccpy▐   Copia un bloque de n bytes de fuente a destino."
  11947. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  11948. ""
  11949. " Sintaxis:"
  11950. "  Near: void *memccpy (void *destino, const void *fuente, int c, size_t n);"
  11951. "  Far:  void far * far _fmemccpy (void far *destino, const void far *fuente,"
  11952. "                                  int c, size_t n);"
  11953. ""
  11954. "Esta función se para después de copiar un byte que coincida con c y devuelve"
  11955. "un puntero al byte en destino inmediatamente siguiente a c; en otro caso"
  11956. "devuelve NULL."
  11957. ""
  11958. "Ejemplo:"
  11959. ""
  11960. " #include <stdio.h>"
  11961. " #include <mem.h>"
  11962. ""
  11963. " void main (void)"
  11964. " {"
  11965. "   char s1[10];"
  11966. "   const char *s2 = "abc";"
  11967. "   const char c1 = 'd';"
  11968. "   const char c2 = 'b';"
  11969. ""
  11970. "   printf ("%s", memccpy (s1, s2, c1, strlen (s2))); /* imprime «(null)» */"
  11971. "   printf ("%s", memccpy (s1, s2, c2, strlen (s2))); /* imprime «c» */"
  11972. " }"
  11973. ""
  11974. ""
  11975. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  11976. " ▌memchr, _fmemchr▐  Busca el carácter c en los primeros n bytes del array s."
  11977. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  11978. ""
  11979. " Sintaxis:"
  11980. "  Near: void *memchr (const void *s, int c, size_t n);"
  11981. "  Far:  void far * far _fmemchr (const void far *s, int c, size_t n);"
  11982. ""
  11983. "Devuelve un puntero a la primera ocurrencia de c en s; devuelve NULL si c"
  11984. "no aparece en el array s."
  11985. ""
  11986. "Ejemplo:"
  11987. ""
  11988. " #include <stdio.h>"
  11989. " #include <mem.h>"
  11990. " #include <string.h>"
  11991. ""
  11992. " void main (void)"
  11993. " {"
  11994. "   const char *s = "abc";"
  11995. "   const char c1 = 'd';"
  11996. "   const char c2 = 'b';"
  11997. ""
  11998. "   printf ("%s", memchr (s, c1, strlen (s))); /* imprime «(null)» */"
  11999. "   printf ("%s", memchr (s, c2, strlen (s))); /* imprime «(bc)» */"
  12000. " }"
  12001. ""
  12002. ""
  12003. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  12004. " ▌memcmp, _fmemcmp▐   Compara dos strings, s1 y s2, para una longitud de"
  12005. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   n bytes exactamente."
  12006. ""
  12007. " Sintaxis:"
  12008. "  Near: int memcmp (const void *s1, const void *s2, size_t n);"
  12009. "  Far:  int far _fmemcmp (const void far *s1, const void far *s2, size_t n);"
  12010. ""
  12011. "Devuelve uno de los valores siguientes:"
  12012. ""
  12013. "   < 0 si s1 is menor que s2"
  12014. "  == 0 si s1 is igual que s2"
  12015. "   > 0 si s1 is mayor que s2"
  12016. ""
  12017. "Ejemplo:"
  12018. ""
  12019. " #include <stdio.h>"
  12020. " #include <mem.h>"
  12021. " #include <string.h>"
  12022. ""
  12023. " void main (void)"
  12024. " {"
  12025. "   const char *s1 = "abc";"
  12026. "   const char *s2 = "aBc";"
  12027. ""
  12028. "   printf ("%d", memcmp (s1, s2, strlen (s1))); /* imprime «32» */"
  12029. " }"
  12030. ""
  12031. ""
  12032. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  12033. " ▌memcpy, _fmemcpy▐   Copia un bloque de n bytes de fuente a destino."
  12034. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  12035. ""
  12036. " Sintaxis:"
  12037. "  Near: void *memcpy (void *destino, const void *fuente, size_t n);"
  12038. "  Far:  void far *far _fmemcpy (void far *destino, const void far *fuente,"
  12039. "                                size_t n);"
  12040. ""
  12041. "Devuelve destino."
  12042. ""
  12043. "Ejemplo:"
  12044. ""
  12045. " #include <stdio.h>"
  12046. " #include <mem.h>"
  12047. " #include <string.h>"
  12048. ""
  12049. " void main (void)"
  12050. " {"
  12051. "   char s1[10];"
  12052. "   const char *s2 = "abc";"
  12053. ""
  12054. "   printf ("%s", memcpy (s1, s2, strlen (s2))); /* imprime «abc» */"
  12055. " }"
  12056. ""
  12057. ""
  12058. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  12059. " ▌memicmp, _fmemicmp▐   Compara los primeros n bytes de s1 y s2, ignorando"
  12060. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   el caso."
  12061. ""
  12062. " Sintaxis:"
  12063. "  Near: int memicmp (const void *s1, const void *s2, size_t n);"
  12064. "  Far:  int far _fmemicmp (const void far *s1, const void far *s2, size_t n);"
  12065. ""
  12066. "Devuelve uno de los valores siguientes:"
  12067. ""
  12068. "   < 0 si s1 is menor que s2"
  12069. "  == 0 si s1 is igual que s2"
  12070. "   > 0 si s1 is mayor que s2"
  12071. ""
  12072. "Ejemplo:"
  12073. ""
  12074. " #include <stdio.h>"
  12075. " #include <mem.h>"
  12076. " #include <string.h>"
  12077. ""
  12078. " void main (void)"
  12079. " {"
  12080. "   const char *s1 = "abc";"
  12081. "   const char *s2 = "aBc";"
  12082. ""
  12083. "   printf ("%d", memicmp (s1, s2, strlen (s1))); /* imprime «0» */"
  12084. " }"
  12085. ""
  12086. ""
  12087. " ▄▄▄▄▄▄▄▄▄"
  12088. " ▌memmove▐   Copia un bloque de n bytes de fuente a destino."
  12089. " ▀▀▀▀▀▀▀▀▀"
  12090. ""
  12091. " Sintaxis:"
  12092. "   void *memmove (void *destino, const void *fuente, size_t n);"
  12093. ""
  12094. "Devuelve destino."
  12095. ""
  12096. "Ejemplo:"
  12097. ""
  12098. " #include <stdio.h>"
  12099. " #include <mem.h>"
  12100. ""
  12101. " void main (void)"
  12102. " {"
  12103. "   char s1[10];"
  12104. "   const char *s2 = "abc";"
  12105. ""
  12106. "   printf ("%s", memmove (s1, s2, strlen (s2))); /* imprime «abc» */"
  12107. " }"
  12108. ""
  12109. ""
  12110. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  12111. " ▌memset, _fmemset▐   Copia n veces el byte c en s."
  12112. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  12113. ""
  12114. " Sintaxis:"
  12115. "  Near: void *memset (void *s, int c, size_t n);"
  12116. "  Far:  void far * far _fmemset (void far *s, int c, size_t n);"
  12117. ""
  12118. "Devuelve s."
  12119. ""
  12120. "Ejemplo:"
  12121. ""
  12122. " #include <stdio.h>"
  12123. " #include <mem.h>"
  12124. ""
  12125. " void main (void)"
  12126. " {"
  12127. "   char s[5];"
  12128. "   char c = 'a';"
  12129. ""
  12130. "   printf ("%s", (memset (s, c, 4), s[4] = 0, s)); /* imprime «aaaa» */"
  12131. " }"
  12132. ""
  12133. ""
  12134. " ▄▄▄▄▄▄▄▄▄▄"
  12135. " ▌movedata▐   Copia n bytes."
  12136. " ▀▀▀▀▀▀▀▀▀▀"
  12137. ""
  12138. " Sintaxis:"
  12139. "   void movedata(unsigned segmento_fuente, unsigned desplazamiento_fuente,"
  12140. "                 unsigned segmento_destino, unsigned desplazamiento_destino,"
  12141. "                 size_t n);"
  12142. ""
  12143. "Copia n bytes de segmento_fuente:desplazamiento_fuente a"
  12144. "segmento_destino:desplazamiento_destino."
  12145. ""
  12146. "Ejemplo:"
  12147. ""
  12148. "#include <stdio.h> /* printf () */"
  12149. "#include <mem.h>   /* movedata () */"
  12150. "#include <dos.h>   /* FP_SEG(): devuelve segmento de una dirección"
  12151. "                      FP_OFF(): devuelve desplazamiento de una dirección */"
  12152. ""
  12153. "void main (void)"
  12154. "{"
  12155. "  char far *s1[10];"
  12156. "  char far *s2 = "abc";"
  12157. ""
  12158. "  movedata (FP_SEG (s2), FP_OFF (s2), FP_SEG (s1), FP_OFF (s1), strlen (s2));"
  12159. "  s1[strlen(s1)] = 0;"
  12160. "  printf ("%s", s1); /* imprime «abc» */"
  12161. "}"
  12162. ""
  12163. ""
  12164. " ▄▄▄▄▄▄▄▄"
  12165. " ▌movmem▐   Mueve un bloque de longitud bytes de fuente a destino."
  12166. " ▀▀▀▀▀▀▀▀"
  12167. ""
  12168. " Sintaxis:"
  12169. "   void movmem (void *fuente, void *destino, unsigned longitud);"
  12170. ""
  12171. "Ejemplo:"
  12172. ""
  12173. " #include <stdio.h>"
  12174. " #include <mem.h>"
  12175. ""
  12176. " void main (void)"
  12177. " {"
  12178. "   char s1[10];"
  12179. "   char *s2 = "abc";"
  12180. ""
  12181. "   movmem (s2, s1, strlen (s2));"
  12182. "   printf ("%s", s1); /* imprime «abc» */"
  12183. " }"
  12184. ""
  12185. ""
  12186. " ▄▄▄▄▄▄▄▄"
  12187. " ▌setmem▐   Asigna un valor a un rango de memoria."
  12188. " ▀▀▀▀▀▀▀▀"
  12189. ""
  12190. " Sintaxis:"
  12191. "   void setmem (void *destino, int longitud, char valor);"
  12192. ""
  12193. " #include <stdio.h>"
  12194. " #include <mem.h>"
  12195. ""
  12196. " void main (void)"
  12197. " {"
  12198. "   char s[10];"
  12199. "   char c = 'a';"
  12200. ""
  12201. "   setmem (s, sizeof(s)-1, c);"
  12202. "   s[9] = 0;"
  12203. "   printf ("%s", s); /* imprime «aaaaaaaaa» */"
  12204. " }"
  12205. ""
  12206. endvis
  12207. endt
  12208. beginv
  12209. cabecera " FUNCIONES MATEMATICAS "
  12210. color 15 3
  12211. centrar_coordenadas_x 2
  12212. borde 2
  12213. "Las funciones matemáticas toman argumentos de tipo ~double~ y devuelven"
  12214. "valores de tipo ~double~. Estas funciones se dividen en las siguientes"
  12215. "categorías:"
  12216. " - Funciones trigonométricas.              - Funciones hiperbólicas."
  12217. " - Funciones logarítmicas y exponenciales. - Otras."
  12218. endv
  12219. beginv
  12220. centrar_coordenadas_x 10
  12221. "Todas las funciones matemáticas necesitan la cabecera ~<math.h>~ en"
  12222. "cualquier programa que las utilice. Además, al declarar las fun-"
  12223. "ciones matemáticas, esta cabecera define tres macros: ~EDOM~, ~ERANGE~,"
  12224. "y ~HUGE_VAL~. Si uno de los argumentos de las funciones matemáticas"
  12225. "no se encuentra en uno de los dominios para el cual está definido,"
  12226. "se devuelve un valor definido por la implementación y la variable"
  12227. "global ~errno~ se activa a ~EDOM~ (error de dominio). Si el resultado"
  12228. "de una rutina es demasiado grande como para ser representado por un"
  12229. "tipo ~double~, se produce desbordamiento. Esto da lugar a que la ruti- "
  12230. "na devuelva ~HUGE_VAL~, y ~errno~ se active a ~ERANGE~ (que indica error"
  12231. "de rango). Si se produce un desbordamiento por abjao, la rutina de-"
  12232. "vuelve 0 y activa ~errno~ a ~ERANGE~."
  12233. endv
  12234. borrar_pantalla
  12235. beginvis
  12236. no_multiatributo
  12237. cabecera " FICHERO DE CABECERA MATH.H "
  12238. coordenadas_completas 1 2 80 24
  12239. color 0 3
  12240. borde 2
  12241. "GLOSARIO:"
  12242. "*********"
  12243. ""
  12244. " ▄▄▄▄▄"
  12245. " ▌abs▐   Macro que devuelve el valor absoluto de de un entero."
  12246. " ▀▀▀▀▀"
  12247. " ▄▄▄▄▄▄"
  12248. " ▌acos▐   Arcocoseno."
  12249. " ▀▀▀▀▀▀"
  12250. " ▄▄▄▄▄▄"
  12251. " ▌asin▐   Arcoseno."
  12252. " ▀▀▀▀▀▀"
  12253. " ▄▄▄▄▄▄"
  12254. " ▌atan▐   Arcotangente."
  12255. " ▀▀▀▀▀▀"
  12256. " ▄▄▄▄▄▄▄"
  12257. " ▌atan2▐   Arcotangente de y/x."
  12258. " ▀▀▀▀▀▀▀"
  12259. " ▄▄▄▄▄▄"
  12260. " ▌atof▐   Convierte una cadena punto flotante."
  12261. " ▀▀▀▀▀▀"
  12262. begint
  12263. " ▄▄▄▄▄▄"
  12264. " ▌cabs▐   (TC) Valor absoluto de un número complejo."
  12265. " ▀▀▀▀▀▀"
  12266. endt
  12267. " ▄▄▄▄▄▄"
  12268. " ▌ceil▐   Redondea por arriba."
  12269. " ▀▀▀▀▀▀"
  12270. " ▄▄▄▄▄"
  12271. " ▌cos▐   Coseno."
  12272. " ▀▀▀▀▀"
  12273. " ▄▄▄▄▄▄"
  12274. " ▌cosh▐   Coseno hiperbólico."
  12275. " ▀▀▀▀▀▀"
  12276. " ▄▄▄▄▄"
  12277. " ▌exp▐   Calcula e elevando a la x-éxima potencia."
  12278. " ▀▀▀▀▀"
  12279. " ▄▄▄▄▄▄"
  12280. " ▌fabs▐   Valor absoluto de valor en punto flotante."
  12281. " ▀▀▀▀▀▀"
  12282. " ▄▄▄▄▄▄▄"
  12283. " ▌floor▐   Redondea por abajo."
  12284. " ▀▀▀▀▀▀▀"
  12285. " ▄▄▄▄▄▄"
  12286. " ▌fmod▐   Calcula x módulo y, el resto de x/y."
  12287. " ▀▀▀▀▀▀"
  12288. " ▄▄▄▄▄▄▄"
  12289. " ▌frexp▐   Descompone un double en mantisa y exponente."
  12290. " ▀▀▀▀▀▀▀"
  12291. begint
  12292. " ▄▄▄▄▄▄▄"
  12293. " ▌hypot▐   (TC) Calcula hipotenusa de un triángulo rectángulo."
  12294. " ▀▀▀▀▀▀▀"
  12295. endt
  12296. " ▄▄▄▄▄▄"
  12297. " ▌labs▐   Calcula el valor absoluto de un long."
  12298. " ▀▀▀▀▀▀"
  12299. " ▄▄▄▄▄▄▄"
  12300. " ▌ldexp▐   Calcula el producto entre x y 2 elevado a exp."
  12301. " ▀▀▀▀▀▀▀"
  12302. " ▄▄▄▄▄"
  12303. " ▌log▐   Función logaritmo neperiano."
  12304. " ▀▀▀▀▀"
  12305. " ▄▄▄▄▄▄▄"
  12306. " ▌log10▐   Función logaritmo en base 10."
  12307. " ▀▀▀▀▀▀▀"
  12308. begint
  12309. " ▄▄▄▄▄▄▄▄▄"
  12310. " ▌matherr▐   (TC) Define un manejador de errores matemáticos."
  12311. " ▀▀▀▀▀▀▀▀▀"
  12312. endt
  12313. " ▄▄▄▄▄▄"
  12314. " ▌modf▐   Descompone en parte entera y parte fraccionaria."
  12315. " ▀▀▀▀▀▀"
  12316. begint
  12317. " ▄▄▄▄▄▄"
  12318. " ▌poly▐   (TC) Genera un polinomio de los argumentos de esta función."
  12319. " ▀▀▀▀▀▀"
  12320. endt
  12321. " ▄▄▄▄▄"
  12322. " ▌pow▐   Función potencia, x elevado a y."
  12323. " ▀▀▀▀▀"
  12324. begint
  12325. " ▄▄▄▄▄▄▄"
  12326. " ▌pow10▐   (TC) Función potencia, 10 elevado a p."
  12327. " ▀▀▀▀▀▀▀"
  12328. endt
  12329. " ▄▄▄▄▄"
  12330. " ▌sin▐   Función seno."
  12331. " ▀▀▀▀▀"
  12332. " ▄▄▄▄▄▄"
  12333. " ▌sinh▐   Función seno hiperbólico."
  12334. " ▀▀▀▀▀▀"
  12335. " ▄▄▄▄▄▄"
  12336. " ▌sqrt▐   Calcula raíz cuadrada."
  12337. " ▀▀▀▀▀▀"
  12338. " ▄▄▄▄▄"
  12339. " ▌tan▐   Tangente."
  12340. " ▀▀▀▀▀"
  12341. " ▄▄▄▄▄▄"
  12342. " ▌tanh▐   Tangente hiperbólica."
  12343. " ▀▀▀▀▀▀"
  12344. begint
  12345. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  12346. "  COMPLEX (struct)    (TC) Representación de número complejo."
  12347. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  12348. endt
  12349. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  12350. "  EDOM (#define)     Código de error para error de dominio."
  12351. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  12352. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  12353. "  ERANGE (#define)     Código de error para error de rango."
  12354. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  12355. begint
  12356. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  12357. "  EXCEPTION (struct)    (TC) Formato de información de error."
  12358. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  12359. endt
  12360. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  12361. "  HUGE_VAL (#define)     Valor de overflow para las funciones matemáticas."
  12362. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  12363. begint
  12364. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  12365. "  M_xxxx (#defines)     (TC) Valores constantes para funciones logarítmicas."
  12366. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  12367. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  12368. "  PI (#defines)    (TC) Constantes comunes de π."
  12369. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  12370. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  12371. "  M_SQRTxx (#defines)    (TC) Valores constantes para raíces cuadradas de 2."
  12372. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  12373. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  12374. "  _mexcep (enum)    (TC) Errores matemáticos."
  12375. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  12376. endt
  12377. ""
  12378. ""
  12379. "FUNCIONES:"
  12380. "**********"
  12381. ""
  12382. " ▄▄▄▄▄"
  12383. " ▌abs▐   Macro que devuelve el valor absoluto de de un entero."
  12384. " ▀▀▀▀▀"
  12385. ""
  12386. " Sintaxis:"
  12387. "   int abs (int x);"
  12388. ""
  12389. "En Turbo C, el prototipo de abs() está en math.h y en stdlib.h. En el"
  12390. "ANSI C sólo se encuentra en el fichero stdlib.h"
  12391. ""
  12392. ""
  12393. " ▄▄▄▄▄▄"
  12394. " ▌acos▐   Arcocoseno."
  12395. " ▀▀▀▀▀▀"
  12396. ""
  12397. " Sintaxis:"
  12398. "   double acos (double x);"
  12399. ""
  12400. "Devuelve el arcocoseno de x (valores de 0 a π). El argumento x debe estar"
  12401. "en el rango -1 a 1; en cualquier otro caso se produce un error de dominio."
  12402. ""
  12403. ""
  12404. " ▄▄▄▄▄▄"
  12405. " ▌asin▐   Arcoseno."
  12406. " ▀▀▀▀▀▀"
  12407. ""
  12408. " Sintaxis:"
  12409. "   double asin (double x);"
  12410. ""
  12411. "Devuelve el arcoseno de x (valores en el rango -π/2 a π/2). El argumento x"
  12412. "debe estar en el rango de -1 a 1; en cualquier otro caso se produce un error"
  12413. "de dominio."
  12414. ""
  12415. ""
  12416. " ▄▄▄▄▄▄"
  12417. " ▌atan▐   Arcotangente."
  12418. " ▀▀▀▀▀▀"
  12419. ""
  12420. " Sintaxis:"
  12421. "   double atan (double x);"
  12422. ""
  12423. "Devuelve el arcotangente de x (un valor en el rango -π/2 a π/2)."
  12424. ""
  12425. ""
  12426. " ▄▄▄▄▄▄▄"
  12427. " ▌atan2▐   Arcotangente de y/x."
  12428. " ▀▀▀▀▀▀▀"
  12429. ""
  12430. " Sintaxis:"
  12431. "   double atan2 (double y, double x);"
  12432. ""
  12433. "Devuelve el arcotangente de y/x (un valor en el rango -π a π). Utiliza"
  12434. "el signo de sus argumentos para obtener el cuadrante del valor devuelto."
  12435. ""
  12436. ""
  12437. " ▄▄▄▄▄▄"
  12438. " ▌atof▐   Convierte una cadena punto flotante."
  12439. " ▀▀▀▀▀▀"
  12440. ""
  12441. " Sintaxis:"
  12442. "   double atof (const char *s);"
  12443. ""
  12444. "Devuelve el valor contenido en s convertido a tipo double, o 0 si s no"
  12445. "puede ser convertido."
  12446. ""
  12447. "En Turbo C, el prototipo de atof() está en math.h y en stdlib.h. En el"
  12448. "ANSI C sólo se encuentra en el fichero stdlib.h"
  12449. ""
  12450. ""
  12451. begint
  12452. " ▄▄▄▄▄▄"
  12453. " ▌cabs▐   (TC) Valor absoluto de un número complejo."
  12454. " ▀▀▀▀▀▀"
  12455. ""
  12456. " Sintaxis:"
  12457. "   double cabs (struct complex z);"
  12458. ""
  12459. "Devuelve el valor absoluto de z como un double."
  12460. ""
  12461. "Ver cómo es struct complex al final de esta ventana."
  12462. ""
  12463. "Ejemplo:"
  12464. ""
  12465. "  /* Este programa imprime: «El valor absoluto de 2.00i 1.00j es 2.24» */"
  12466. ""
  12467. "  #include <stdio.h>"
  12468. "  #include <math.h>"
  12469. ""
  12470. "  int main (void)"
  12471. "  {"
  12472. "    struct complex z;"
  12473. "    double val;"
  12474. ""
  12475. "    z.x = 2.0;"
  12476. "    z.y = 1.0;"
  12477. "    val = cabs (z);"
  12478. ""
  12479. "    printf ("El valor absoluto de %.2lfi %.2lfj es %.2lf", z.x, z.y, val);"
  12480. "    return 0;"
  12481. "  }"
  12482. ""
  12483. ""
  12484. endt
  12485. " ▄▄▄▄▄▄"
  12486. " ▌ceil▐   Redondea por arriba."
  12487. " ▀▀▀▀▀▀"
  12488. ""
  12489. " Sintaxis:"
  12490. "   double ceil (double x);"
  12491. ""
  12492. "Devuelve el menor entero mayor o igual que x y lo representa como double."
  12493. ""
  12494. "Por ejemplo, dado 1.02, ceil() devuelve 2.0. Dado -1.02, ceil() devuelve -1."
  12495. ""
  12496. ""
  12497. " ▄▄▄▄▄"
  12498. " ▌cos▐   Coseno."
  12499. " ▀▀▀▀▀"
  12500. ""
  12501. " Sintaxis:"
  12502. "   double cos (double x);"
  12503. ""
  12504. "Devuelve el coseno de x. El valor de x debe darse en radianes."
  12505. ""
  12506. ""
  12507. " ▄▄▄▄▄▄"
  12508. " ▌cosh▐   Coseno hiperbólico."
  12509. " ▀▀▀▀▀▀"
  12510. ""
  12511. " Sintaxis:"
  12512. "   double cosh (double x);"
  12513. ""
  12514. "Devuelve el coseno hiperbólico de x. El valor de x debe darse en radianes."
  12515. ""
  12516. ""
  12517. " ▄▄▄▄▄"
  12518. " ▌exp▐   Calcula e elevando a la x-éxima potencia."
  12519. " ▀▀▀▀▀"
  12520. ""
  12521. " Sintaxis:"
  12522. "   double exp (double x);"
  12523. ""
  12524. "Devuelve el número e elevado a la potencia de x."
  12525. ""
  12526. ""
  12527. " ▄▄▄▄▄▄"
  12528. " ▌fabs▐   Valor absoluto de valor en punto flotante."
  12529. " ▀▀▀▀▀▀"
  12530. ""
  12531. " Sintaxis:"
  12532. "   double fabs (double x);"
  12533. ""
  12534. "Devuelve el valor absoluto de x."
  12535. ""
  12536. ""
  12537. " ▄▄▄▄▄▄▄"
  12538. " ▌floor▐   Redondea por abajo."
  12539. " ▀▀▀▀▀▀▀"
  12540. ""
  12541. " Sintaxis:"
  12542. "   double floor (double x);"
  12543. ""
  12544. "Devuelve el mayor entero (representando en double) que no es mayor que num."
  12545. ""
  12546. "Por ejemplo, dado 1.02, floor() devuelve 1.0. Dado -1.02, floor()"
  12547. "devuelve -2.0."
  12548. ""
  12549. ""
  12550. " ▄▄▄▄▄▄"
  12551. " ▌fmod▐   Calcula x módulo y, el resto de x/y."
  12552. " ▀▀▀▀▀▀"
  12553. ""
  12554. " Sintaxis:"
  12555. "   double fmod (double x, double y);"
  12556. ""
  12557. "Devuelve el resto de la división entera x/y."
  12558. ""
  12559. ""
  12560. " ▄▄▄▄▄▄▄"
  12561. " ▌frexp▐   Descompone un double en mantisa y exponente."
  12562. " ▀▀▀▀▀▀▀"
  12563. ""
  12564. " Sintaxis:"
  12565. "   double frexp (double x, int *exp);"
  12566. ""
  12567. "La función frexp() descompone el número x en una mantisa de rango entre"
  12568. "0.5 y 1 y en un exponente entero tal que x = mantisa * (2 elevado a exp)."
  12569. "Se devuelve la mantisa, y el exponente se guarda en la variable apuntada"
  12570. "por exp."
  12571. ""
  12572. ""
  12573. begint
  12574. " ▄▄▄▄▄▄▄"
  12575. " ▌hypot▐   (TC) Calcula hipotenusa de un triángulo rectángulo."
  12576. " ▀▀▀▀▀▀▀"
  12577. ""
  12578. " Sintaxis:"
  12579. "   double hypot (double x, double y);"
  12580. ""
  12581. "Devuelve hipotenusa de un triángulo rectángulo en el que los catetos son"
  12582. "x e y."
  12583. ""
  12584. ""
  12585. endt
  12586. " ▄▄▄▄▄▄"
  12587. " ▌labs▐   Calcula el valor absoluto de un long."
  12588. " ▀▀▀▀▀▀"
  12589. ""
  12590. " Sintaxis:"
  12591. "   long int labs (long int x);"
  12592. ""
  12593. "Devuelve el valor absoluto de x, un long int."
  12594. ""
  12595. "En Turbo C, el prototipo de labs() está en math.h y en stdlib.h. En el"
  12596. "ANSI C sólo se encuentra en el fichero stdlib.h"
  12597. ""
  12598. ""
  12599. " ▄▄▄▄▄▄▄"
  12600. " ▌ldexp▐   Calcula el producto entre x y 2 elevado a exp."
  12601. " ▀▀▀▀▀▀▀"
  12602. ""
  12603. " Sintaxis:"
  12604. "   double ldexp (double x, int exp);"
  12605. ""
  12606. "Devuelve x * pow (2, exp). Si se produce desbordamiento, se devuelve"
  12607. "HUGH_VAL."
  12608. ""
  12609. ""
  12610. " ▄▄▄▄▄"
  12611. " ▌log▐   Función logaritmo neperiano."
  12612. " ▀▀▀▀▀"
  12613. ""
  12614. " Sintaxis:"
  12615. "   double log (double x);"
  12616. ""
  12617. "Devuelve el logaritmo neperiano de x. Se produce error de dominio si x es"
  12618. "negativo, y un error de rango si el argumento es 0."
  12619. ""
  12620. ""
  12621. " ▄▄▄▄▄▄▄"
  12622. " ▌log10▐   Función logaritmo en base 10."
  12623. " ▀▀▀▀▀▀▀"
  12624. ""
  12625. " Sintaxis:"
  12626. "   double log10 (double x);"
  12627. ""
  12628. "Devuelve el logaritmo en base 10 de x. Se produce un error de dominio si x"
  12629. "es negativo, y un error de rango si el argumento es 0."
  12630. ""
  12631. ""
  12632. begint
  12633. " ▄▄▄▄▄▄▄▄▄"
  12634. " ▌matherr▐   (TC) Define un manejador de errores matemáticos."
  12635. " ▀▀▀▀▀▀▀▀▀"
  12636. ""
  12637. " Sintaxis:"
  12638. "   int matherr (struct exception *e);"
  12639. ""
  12640. "Esta función no puede ser llamada directamente por el usuario. Cuando"
  12641. "ocurre un error matemático, el sistema llama automáticamente a esta"
  12642. "función. El usuario puede suministrar su propia función matherr para"
  12643. "controlar los errores detectados por la librería matemática."
  12644. ""
  12645. "La función matherr() debe devolver un valor distinto de cero para indicar"
  12646. "que se resuelve problema; en otro caso devueve 0."
  12647. ""
  12648. "Ejemplo 1:"
  12649. ""
  12650. "  #include <stdio.h>"
  12651. "  #include <math.h>"
  12652. ""
  12653. "  void main (void)"
  12654. "  {"
  12655. "    double x;"
  12656. ""
  12657. "    log (-1);"
  12658. "    pow (0, -2);"
  12659. "    exp (-1000);"
  12660. "    sin (10e70);"
  12661. "    x = exp (1000);"
  12662. "    printf ("x = %lg", x);"
  12663. "  }"
  12664. ""
  12665. "Ejemplo 2:"
  12666. ""
  12667. "  #include <stdio.h>"
  12668. "  #include <math.h>"
  12669. ""
  12670. "  int matherr (struct exception *e)"
  12671. "  {"
  12672. "    printf ("%s (%lg [, %lg]): %s.\n", e->name, e->arg1, e->arg2,"
  12673. "            e->type == DOMAIN ? "Error de dominio en argumento" :"
  12674. "            e->type == SING ? "Singularidad en argumento." :"
  12675. "            e->type == OVERFLOW ? "Error de rango de overflow" :"
  12676. "            e->type == UNDERFLOW ? "Error de rango de underflow" :"
  12677. "            e->type == TLOSS ? "Pérdida total de significancia" :"
  12678. "            e->type == PLOSS ? "Pérdida parcial de significancia" :"
  12679. "            "Error matemático");"
  12680. "    e->retval = e->type == OVERFLOW ? HUGE_VAL : 1;"
  12681. "    return 1;"
  12682. "  }"
  12683. ""
  12684. "  void main (void)"
  12685. "  {"
  12686. "    double x;"
  12687. ""
  12688. "    log (-1);"
  12689. "    pow (0, -2);"
  12690. "    exp (-1000);"
  12691. "    sin (10e70);"
  12692. "    x = exp (1000);"
  12693. "    printf ("x = %lg", x);"
  12694. "  }"
  12695. ""
  12696. "La ejecución del programa del ejemplo 1 imprime lo siguiente (en la versión"
  12697. "2.0 de Borland C++):"
  12698. ""
  12699. "  log: DOMAIN error"
  12700. "  pow: DOMAIN error"
  12701. "  exp: OVERFLOW error"
  12702. "  x = 1.79769e+308"
  12703. ""
  12704. "La ejecución del programa del ejemplo 2 imprime lo siguiente (en cualquier"
  12705. "versión de Turbo C):"
  12706. ""
  12707. "  log (-1 [, 0]): Error de dominio en argumento."
  12708. "  pow (0 [, -2]): Error de dominio en argumento."
  12709. "  exp (-1000, [, 0]): Error de rango de underflow."
  12710. "  sin (1e+71 [, 0]): Pérdida total de significancia."
  12711. "  exp (1000 [, 0]): Error de rango de overflow."
  12712. "  x = 1.79769e+308"
  12713. ""
  12714. "Ver al final de esta ventana cómo es struct exception y el sinificado"
  12715. "de los tipos enumerados y constantes simbólicas que aparecen en el"
  12716. "segundo ejemplo."
  12717. ""
  12718. ""
  12719. endt
  12720. " ▄▄▄▄▄▄"
  12721. " ▌modf▐   Descompone en parte entera y parte fraccionaria."
  12722. " ▀▀▀▀▀▀"
  12723. ""
  12724. " Sintaxis:"
  12725. "   double modf (double x, double *parte_entera);"
  12726. ""
  12727. "La función modf() descompone x en sus partes entera y fraccionaria. Devuelve"
  12728. "la parte fraccionaria y sitúa la parte entera en la variable apuntada por"
  12729. "parte_entera."
  12730. ""
  12731. ""
  12732. begint
  12733. " ▄▄▄▄▄▄"
  12734. " ▌poly▐   (TC) Genera un polinomio de los argumentos de esta función."
  12735. " ▀▀▀▀▀▀"
  12736. ""
  12737. " Sintaxis:"
  12738. "   double poly (double x, int grado, double coefs[]);"
  12739. ""
  12740. "Devuelve el valor de un polinomio en x, de grado n, con coeficientes"
  12741. ""
  12742. "  coefs[0], ..., coefs[n]."
  12743. ""
  12744. "Por ejemplo: Si n = 4, el polinomio generado es"
  12745. ""
  12746. "  (coefs[4] * x^4) + (coefs[3] * x^3) +"
  12747. "  (coefs[2] * x^2) + (coefs[1] * x^1) +"
  12748. "  (coefs[0])"
  12749. ""
  12750. "Ejemplo:"
  12751. ""
  12752. "  #include <stdio.h>"
  12753. "  #include <math.h>"
  12754. ""
  12755. "  /* polinomio:  x**3 - 2x**2 + 5x - 1 */"
  12756. ""
  12757. "  int main (void)"
  12758. "  {"
  12759. "    double array[] = { -1.0, 5.0, -2.0, 1.0 };"
  12760. "    double resultado;"
  12761. ""
  12762. "    resultado = poly (2.0, 3, array);"
  12763. "    printf ("El polinomio: x**3 - 2.0x**2 + 5x - 1 en 2.0 es %lg.\n","
  12764. "            resultado);"
  12765. "    return 0;"
  12766. "  }"
  12767. ""
  12768. "  /* imprime: «El polinomio: x**3 - 2.0x**2 + 5x - 1 en 2.0 es 9.» */"
  12769. ""
  12770. ""
  12771. endt
  12772. " ▄▄▄▄▄"
  12773. " ▌pow▐   Función potencia, x elevado a y."
  12774. " ▀▀▀▀▀"
  12775. ""
  12776. " Sintaxis:"
  12777. "   double pow (double base, double exponente);"
  12778. ""
  12779. "Devuelve base elevado a exponente. Se produce un error de dominio si base"
  12780. "es 0 y exponente es menor o igual que 0. También puede ocurrir si base es"
  12781. "negativo y exponente no es entero. Un desbordamiento produce un error de"
  12782. "rango."
  12783. ""
  12784. ""
  12785. begint
  12786. " ▄▄▄▄▄▄▄"
  12787. " ▌pow10▐   (TC) Función potencia, 10 elevado a p."
  12788. " ▀▀▀▀▀▀▀"
  12789. ""
  12790. " Sintaxis:"
  12791. "   double pow10 (int p);"
  12792. ""
  12793. "Devuelve 10 elevado a p."
  12794. ""
  12795. ""
  12796. endt
  12797. " ▄▄▄▄▄"
  12798. " ▌sin▐   Función seno."
  12799. " ▀▀▀▀▀"
  12800. ""
  12801. " Sintaxis:"
  12802. "   double sin (double x);"
  12803. ""
  12804. "Devuelve el seno de x. El valor de x debe darse en radianes."
  12805. ""
  12806. ""
  12807. " ▄▄▄▄▄▄"
  12808. " ▌sinh▐   Función seno hiperbólico."
  12809. " ▀▀▀▀▀▀"
  12810. ""
  12811. " Sintaxis:"
  12812. "   double sinh (double x);"
  12813. ""
  12814. "Devuelve el seno hiperbólico de x. El valor de x debe darse en radianes."
  12815. ""
  12816. ""
  12817. " ▄▄▄▄▄▄"
  12818. " ▌sqrt▐   Calcula raíz cuadrada."
  12819. " ▀▀▀▀▀▀"
  12820. ""
  12821. " Sintaxis:"
  12822. "   double sqrt (double x);"
  12823. ""
  12824. "Devuelve la raíz cuadrada de x. Si se llama con un número negativo se"
  12825. "produce un error de dominio."
  12826. ""
  12827. ""
  12828. " ▄▄▄▄▄"
  12829. " ▌tan▐   Tangente."
  12830. " ▀▀▀▀▀"
  12831. ""
  12832. " Sintaxis:"
  12833. "   double tan (double x);"
  12834. ""
  12835. "Devuelve la tangente de x. El valor de x debe darse en radianes."
  12836. ""
  12837. ""
  12838. " ▄▄▄▄▄▄"
  12839. " ▌tanh▐   Tangente hiperbólica."
  12840. " ▀▀▀▀▀▀"
  12841. ""
  12842. " Sintaxis:"
  12843. "   double tanh (double x);"
  12844. ""
  12845. "Devuelve la tangente hiperbólica de x."
  12846. ""
  12847. ""
  12848. "CONSTANTES, TIPOS DE DATOS, Y VARIABLES GLOBALES:"
  12849. "*************************************************"
  12850. ""
  12851. begint
  12852. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  12853. "  COMPLEX (struct)"
  12854. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  12855. ""
  12856. "(TC) Representación de número complejo."
  12857. ""
  12858. "  struct complex {"
  12859. "    double  x, y;"
  12860. "  };"
  12861. ""
  12862. "Esta estructura es usada solamente por la función cabs()."
  12863. ""
  12864. "Ver ejemplo de cómo usar esta estructura en la descripción de la función"
  12865. "cabs()."
  12866. ""
  12867. ""
  12868. endt
  12869. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  12870. "  EDOM (#define)"
  12871. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  12872. ""
  12873. "Código de error para errores de dominios matemáticos, es decir, cuando"
  12874. "el argumento de la función matemática está fuera del dominio."
  12875. ""
  12876. "Este valor es asignado a errno cuando se produce un error de rango."
  12877. ""
  12878. ""
  12879. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  12880. "  ERANGE (#define)"
  12881. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  12882. ""
  12883. "Código de error para resultados fuera de rango."
  12884. ""
  12885. "Este valor es asignado a errno cuando se produce un error de rango."
  12886. ""
  12887. ""
  12888. begint
  12889. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  12890. "  EXCEPTION (struct)"
  12891. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  12892. ""
  12893. "(TC) El formato de información de error para las rutinas matemáticas."
  12894. ""
  12895. "  struct exception {"
  12896. "    int     type;"
  12897. "    char   *name;"
  12898. "    double  arg1, arg2, retval;"
  12899. "  };"
  12900. ""
  12901. "Ver ejemplo en la descripción de la función matherr() para saber cómo"
  12902. "usar esta estructura."
  12903. ""
  12904. ""
  12905. endt
  12906. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  12907. "  HUGE_VAL (#define)"
  12908. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  12909. ""
  12910. "Valor de overflow para las funciones matemáticas."
  12911. ""
  12912. "Ver ejemplo en descripción de la función matherr() para ver cómo se"
  12913. "puede usar."
  12914. begint
  12915. ""
  12916. ""
  12917. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  12918. "  M_xxxx (#defines)"
  12919. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  12920. ""
  12921. "(TC) Los valores constantes para funciones logarítmicas."
  12922. ""
  12923. "  M_E        El valor de e."
  12924. "  M_LOG2E    El valor de log(e)."
  12925. "  M_LOG10E   El valore log10(e)."
  12926. "  M_LN2      El valore log(2)."
  12927. "  M_LN10     El vvalo log(10)."
  12928. ""
  12929. ""
  12930. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  12931. "  PI (#defines)"
  12932. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  12933. ""
  12934. "(TC) Constantes comunes de π."
  12935. ""
  12936. "  M_PI         π"
  12937. "  M_PI_2       Un medio de π                    (π/2)"
  12938. "  M_PI_4       Un cuarto de π                   (π/4)"
  12939. "  M_1_PI       Uno divido por π                 (1/π)"
  12940. "  M_2_PI       Dos divido por π                 (2/π)"
  12941. "  M_1_SQRTPI   Raíz cuadrada de π               (√π)"
  12942. "  M_2_SQRTPI   Mitad de la raíz cuadrada de π   ((√π)/2)"
  12943. ""
  12944. ""
  12945. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  12946. "  M_SQRTxx (#defines)"
  12947. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  12948. ""
  12949. "(TC) Valores constantes para raíces cuadradas de 2."
  12950. ""
  12951. "  M_SQRT2    Raíz cuadrada de 2               (√2)"
  12952. "  M_SQRT_2   Mitad de la raíz cuadrada de 2   (√2)/2"
  12953. ""
  12954. ""
  12955. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  12956. "  _mexcep (enum)"
  12957. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  12958. ""
  12959. "(TC) Estas constantes representan posibles errores matemáticos."
  12960. ""
  12961. "  DOMAIN      Error de dominio en argumento."
  12962. "  SING        Singularidad en argumento."
  12963. "  OVERFLOW    Error de rango de overflow."
  12964. "  UNDERFLOW   Error de rango de underflow."
  12965. "  TLOSS       Pérdida total de significancia."
  12966. "  PLOSS       Pérdida parcial de significancia."
  12967. ""
  12968. "Ver ejemplo en descripción de la función matherr para saber cómo usar"
  12969. "estas constantes."
  12970. endt
  12971. ""
  12972. endvis
  12973. begint
  12974. partir      aquí interesa que esté dentro del begint
  12975. beginv
  12976. cabecera " FUNCIONES DE PANTALLA Y DE GRAFICOS "
  12977. color 15 3
  12978. centrar_coordenadas_x 2
  12979. borde 2
  12980. "Las funciones de pantalla y de gráficos no están definidas por el estándar"
  12981. "ANSI. Esto ocurre por una simple razón: son, por naturaleza, dependientes"
  12982. "del entorno fijado y en gran parte no portables. Actualmente no hay una in-"
  12983. "terfaz gráfica que sea ampliamente aceptada, ni hay un conjunto universal de"
  12984. "órdenes de control de pantalla. Sin embargo, estos tipos de funciones son de"
  12985. "importancia primordial cuando se crea software que requiere control de pan-"
  12986. "talla de alta resolución y de calidad de gráficos para el mercado de soft-"
  12987. "ware. Las funciones descritas en las dos siguientes pantallas pertenecen al"
  12988. "~Turbo C~."
  12989. endv
  12990. beginv
  12991. centrar_coordenadas_x 9
  12992. color 14 3
  12993. "Estas funciones se descomponen en dos grupos: aquellas que desempeñan fun-"
  12994. "ciones relacionadas con las pantallas de texto y aquellas que se refieren"
  12995. "a los gráficos. Las funciones gráficos requieren la cabecera ~<graphics.h>~"
  12996. "y las funciones de pantalla requieren la cabecera ~<conio.h>~."
  12997. endv
  12998. beginv
  12999. centrar_coordenadas_x 15
  13000. color 15 3
  13001. "Tanto en modo texto como en modo gráfico, la mayoría de las funciones traba-"
  13002. "jan con una ventana. Una ventana es un trozo rectangular de la pantalla que"
  13003. "hace la función de pantalla completa. Por defecto, la ventana de trabajo es"
  13004. "la pantalla completa; pero se puede cambiar con la función ~window()~ en modo"
  13005. "texto y con la función ~setviewport()~ en modo gráfico. Por ejemplo, la sen-"
  13006. "tencia gotoxy(2,2) hace que el cursor se posicione en la posición (2,2) re-"
  13007. "lativa a la ventana actual, si la ventana actual es la pantalla entera, en-"
  13008. "tonces se posicionará en la posición (2,2) de la pantalla."
  13009. endv
  13010. borrar_pantalla
  13011. beginvis
  13012. no_multiatributo
  13013. cabecera " FICHERO DE CABECERA CONIO.H (TC) "
  13014. coordenadas_completas 1 2 80 24
  13015. color 0 3
  13016. borde 2
  13017. "GLOSARIO:"
  13018. "*********"
  13019. ""
  13020. " ▄▄▄▄▄▄▄"
  13021. " ▌cgets▐   Lee una cadena de consola."
  13022. " ▀▀▀▀▀▀▀"
  13023. " ▄▄▄▄▄▄▄▄"
  13024. " ▌clreol▐   Borra hasta final de línea en ventana de texto."
  13025. " ▀▀▀▀▀▀▀▀"
  13026. " ▄▄▄▄▄▄▄▄"
  13027. " ▌clrscr▐   Borra ventana de texto."
  13028. " ▀▀▀▀▀▀▀▀"
  13029. " ▄▄▄▄▄▄▄▄▄"
  13030. " ▌cprintf▐   Escribe salida formateada en la ventana de texto en la pantalla."
  13031. " ▀▀▀▀▀▀▀▀▀"
  13032. " ▄▄▄▄▄▄▄"
  13033. " ▌cputs▐   Escribe una cadena en la ventana de texto en la pantalla."
  13034. " ▀▀▀▀▀▀▀"
  13035. " ▄▄▄▄▄▄▄▄"
  13036. " ▌cscanf▐   Lee entrada formateada de consola."
  13037. " ▀▀▀▀▀▀▀▀"
  13038. " ▄▄▄▄▄▄▄▄▄"
  13039. " ▌delline▐   Borra línea en ventana de texto."
  13040. " ▀▀▀▀▀▀▀▀▀"
  13041. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13042. " ▌getch and getche▐   Lee carácter de consola, con eco a pantalla (getche),"
  13043. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   o sin eco (getch)."
  13044. " ▄▄▄▄▄▄▄▄▄"
  13045. " ▌getpass▐   Lee un password (palabra de paso)."
  13046. " ▀▀▀▀▀▀▀▀▀"
  13047. " ▄▄▄▄▄▄▄▄▄"
  13048. " ▌gettext▐   Copia texto de pantalla en modo texto a memoria."
  13049. " ▀▀▀▀▀▀▀▀▀"
  13050. " ▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13051. " ▌gettextinfo▐   Obtiene información de vídeo en modo texto."
  13052. " ▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13053. " ▄▄▄▄▄▄▄▄"
  13054. " ▌gotoxy▐   Posiciona cursor en ventana de texto."
  13055. " ▀▀▀▀▀▀▀▀"
  13056. " ▄▄▄▄▄▄▄▄▄▄▄"
  13057. " ▌highvideo▐   Selecciona caracteres de texto en alta intensidad."
  13058. " ▀▀▀▀▀▀▀▀▀▀▀"
  13059. " ▄▄▄▄▄▄▄▄▄"
  13060. " ▌insline▐   Inserta línea en blanco en ventana de texto en la posición"
  13061. " ▀▀▀▀▀▀▀▀▀   actual del cursor."
  13062. " ▄▄▄▄▄▄▄"
  13063. " ▌kbhit▐   Chequea para ver si se ha pulsado alguna tecla, es decir, para"
  13064. " ▀▀▀▀▀▀▀   ver si hay alguna tecla disponible en el buffer de teclas."
  13065. " ▄▄▄▄▄▄▄▄▄▄"
  13066. " ▌lowvideo▐   Selecciona salida de caracteres en ventana de texto en baja"
  13067. " ▀▀▀▀▀▀▀▀▀▀   intensidad."
  13068. " ▄▄▄▄▄▄▄▄▄▄"
  13069. " ▌movetext▐   Copia texto en pantalla de un rectángulo a otro (en modo"
  13070. " ▀▀▀▀▀▀▀▀▀▀   texto)."
  13071. " ▄▄▄▄▄▄▄▄▄▄▄"
  13072. " ▌normvideo▐   Selecciona caracteres en intensidad normal."
  13073. " ▀▀▀▀▀▀▀▀▀▀▀"
  13074. " ▄▄▄▄▄▄▄"
  13075. " ▌putch▐   Escribe un carácter en la ventana de texto sobre en la pantalla."
  13076. " ▀▀▀▀▀▀▀"
  13077. " ▄▄▄▄▄▄▄▄▄"
  13078. " ▌puttext▐   Copia texto de memoria a la pantalla."
  13079. " ▀▀▀▀▀▀▀▀▀"
  13080. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13081. " ▌_setcursortype▐   Selecciona la apariencia del cursor."
  13082. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13083. " ▄▄▄▄▄▄▄▄▄▄"
  13084. " ▌textattr▐   Pone los atributos de texto para las funciones de ventana de"
  13085. " ▀▀▀▀▀▀▀▀▀▀   texto."
  13086. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13087. " ▌textbackground▐   Selecciona nuevo color de fondo de los caracteres en"
  13088. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   modo texto."
  13089. " ▄▄▄▄▄▄▄▄▄▄▄"
  13090. " ▌textcolor▐   Selecciona nuevo color de texto de los caracteres en modo"
  13091. " ▀▀▀▀▀▀▀▀▀▀▀   texto."
  13092. " ▄▄▄▄▄▄▄▄▄▄"
  13093. " ▌textmode▐   Cambia modo de pantalla (en modo texto)."
  13094. " ▀▀▀▀▀▀▀▀▀▀"
  13095. " ▄▄▄▄▄▄▄▄▄"
  13096. " ▌ungetch▐   Devuelve un carácter al teclado."
  13097. " ▀▀▀▀▀▀▀▀▀"
  13098. " ▄▄▄▄▄▄▄▄"
  13099. " ▌wherex▐   Devuelve posición horizontal del cursor dentro de la ventana"
  13100. " ▀▀▀▀▀▀▀▀   de texto corriente."
  13101. " ▄▄▄▄▄▄▄▄"
  13102. " ▌wherey▐   Devuelve posición vertical del cursor dentro de la ventana"
  13103. " ▀▀▀▀▀▀▀▀   de texto corriente."
  13104. " ▄▄▄▄▄▄▄▄"
  13105. " ▌window▐   Define ventana activa en modo texto."
  13106. " ▀▀▀▀▀▀▀▀"
  13107. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13108. "  COLORS (enum)    Colores/atributos del vídeo CGA estándar."
  13109. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13110. " ▄▄▄▄▄▄▄"
  13111. "  BLINK    Sirve para sumar a color de fondo cuando queremos escribir"
  13112. " ▀▀▀▀▀▀▀   caracteres parpadeantes."
  13113. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13114. "  directvideo (variable gloval)    Controla salida de vídeo."
  13115. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13116. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13117. "  TEXT_INFO (struct)    Información de ventana de texto actual."
  13118. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13119. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13120. "  text_modes (enum)    Modos de vídeo estándar."
  13121. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13122. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13123. "  _wscroll (variable global)    Controla el scroll en las ventanas de texto."
  13124. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13125. ""
  13126. ""
  13127. "FUNCIONES:"
  13128. "**********"
  13129. ""
  13130. " ▄▄▄▄▄▄▄"
  13131. " ▌cgets▐   Lee una cadena de consola."
  13132. " ▀▀▀▀▀▀▀"
  13133. ""
  13134. " Sintaxis:"
  13135. "   char *cgets (char *cad);"
  13136. ""
  13137. "cad[0] debe contener la longitud máxima de la cadena a ser leída. A la"
  13138. "vuelta, cad[1] contiene el número de caracteres leídos realmente. La cadena"
  13139. "empieza en cad[2]. La función devuelve &cad[2]."
  13140. ""
  13141. ""
  13142. " ▄▄▄▄▄▄▄▄"
  13143. " ▌clreol▐   Borra hasta final de línea en ventana de texto."
  13144. " ▀▀▀▀▀▀▀▀"
  13145. ""
  13146. " Sintaxis:"
  13147. "   void clreol (void);"
  13148. ""
  13149. ""
  13150. " ▄▄▄▄▄▄▄▄"
  13151. " ▌clrscr▐   Borra ventana de texto."
  13152. " ▀▀▀▀▀▀▀▀"
  13153. ""
  13154. " Sintaxis:"
  13155. "   void clrscr(void);"
  13156. ""
  13157. ""
  13158. " ▄▄▄▄▄▄▄▄▄"
  13159. " ▌cprintf▐   Escribe salida formateada en la ventana de texto en la pantalla."
  13160. " ▀▀▀▀▀▀▀▀▀"
  13161. ""
  13162. " Sintaxis:"
  13163. "   int cprintf (const char *formato [, argumento,...]);"
  13164. ""
  13165. "Devuelve el número de bytes escritos."
  13166. ""
  13167. ""
  13168. " ▄▄▄▄▄▄▄"
  13169. " ▌cputs▐   Escribe una cadena en la ventana de texto en la pantalla."
  13170. " ▀▀▀▀▀▀▀"
  13171. ""
  13172. " Sintaxis:"
  13173. "   int cputs (const char *cad);"
  13174. ""
  13175. "Devuelve el último carácter escrito."
  13176. ""
  13177. ""
  13178. " ▄▄▄▄▄▄▄▄"
  13179. " ▌cscanf▐   Lee entrada formateada de consola."
  13180. " ▀▀▀▀▀▀▀▀"
  13181. ""
  13182. " Sintaxis:"
  13183. "   int cscanf (char *formato [ , direccion, ... ]);"
  13184. ""
  13185. "Devuelve el número de campos procesados con éxito. Si una función intenta"
  13186. "leer en final de fichero, el valor devuelto es EOF."
  13187. ""
  13188. ""
  13189. " ▄▄▄▄▄▄▄▄▄"
  13190. " ▌delline▐   Borra línea en ventana de texto."
  13191. " ▀▀▀▀▀▀▀▀▀"
  13192. ""
  13193. " Sintaxis:"
  13194. "   void delline (void);"
  13195. ""
  13196. ""
  13197. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13198. " ▌getch and getche▐   Lee carácter de consola, con eco a pantalla (getche),"
  13199. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   o sin eco (getch)."
  13200. ""
  13201. " Sintaxis:"
  13202. "   int getch (void);"
  13203. "   int getche (void);"
  13204. ""
  13205. "Ambas funciones devuelven el carácter leído. Los caracteres están"
  13206. "disponibles inmediatamente (no hay buffer de líneas completas)."
  13207. ""
  13208. "Las teclas especiales tales como las teclas de función y las teclas de"
  13209. "los cursores están representadas por una secuencia de dos caracteres: un"
  13210. "carácter cero seguido por el código de exploración para la tecla presionada."
  13211. ""
  13212. ""
  13213. " ▄▄▄▄▄▄▄▄▄"
  13214. " ▌getpass▐   Lee un password (palabra de paso)."
  13215. " ▀▀▀▀▀▀▀▀▀"
  13216. ""
  13217. " Sintaxis:"
  13218. "   char *getpass (const char *prompt);"
  13219. ""
  13220. "El valor devuelto es un puntero a una cadena estática que es sobreescrita"
  13221. "en cada llamada."
  13222. ""
  13223. ""
  13224. " ▄▄▄▄▄▄▄▄▄"
  13225. " ▌gettext▐   Copia texto de pantalla en modo texto a memoria."
  13226. " ▀▀▀▀▀▀▀▀▀"
  13227. ""
  13228. " Sintaxis:"
  13229. "   int gettext (int izq, int ar, int der, int ab, void *destino);"
  13230. ""
  13231. "Las coordenadas son absolutas, no son relativas a la ventana actual. La"
  13232. "esquina superior izquierda es (1,1). Devuelve un valor distinto de cero"
  13233. "si tiene éxito."
  13234. ""
  13235. ""
  13236. " ▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13237. " ▌gettextinfo▐   Obtiene información de vídeo en modo texto."
  13238. " ▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13239. ""
  13240. " Sintaxis:"
  13241. "   void gettextinfo (struct text_info *r);"
  13242. ""
  13243. "El resultado es devuelto en r."
  13244. ""
  13245. ""
  13246. " ▄▄▄▄▄▄▄▄"
  13247. " ▌gotoxy▐   Posiciona cursor en ventana de texto."
  13248. " ▀▀▀▀▀▀▀▀"
  13249. ""
  13250. " Sintaxis:"
  13251. "   void gotoxy (int x, int y);"
  13252. ""
  13253. ""
  13254. " ▄▄▄▄▄▄▄▄▄▄▄"
  13255. " ▌highvideo▐   Selecciona caracteres de texto en alta intensidad."
  13256. " ▀▀▀▀▀▀▀▀▀▀▀"
  13257. ""
  13258. " Sintaxis:"
  13259. "   void highvideo (void);"
  13260. ""
  13261. "Afecta a subsecuentes llamadas a funciones de ventana de texto tales como"
  13262. "putch() y cprintf()."
  13263. ""
  13264. ""
  13265. " ▄▄▄▄▄▄▄▄▄"
  13266. " ▌insline▐   Inserta línea en blanco en ventana de texto en la posición"
  13267. " ▀▀▀▀▀▀▀▀▀   actual del cursor."
  13268. ""
  13269. " Sintaxis:"
  13270. "   void insline (void);"
  13271. ""
  13272. "Las líneas por debajo de la posición del cursor son subidas una línea"
  13273. "hacia arria y la última línea se pierde."
  13274. ""
  13275. ""
  13276. " ▄▄▄▄▄▄▄"
  13277. " ▌kbhit▐   Chequea para ver si se ha pulsado alguna tecla, es decir, para"
  13278. " ▀▀▀▀▀▀▀   ver si hay alguna tecla disponible en el buffer de teclas."
  13279. ""
  13280. " Sintaxis:"
  13281. "   int kbhit (void);"
  13282. ""
  13283. "Si una tecla está disponible, kbhi() devuelve un entero distino de cero; si"
  13284. "no es así, devuelve 0."
  13285. ""
  13286. ""
  13287. " ▄▄▄▄▄▄▄▄▄▄"
  13288. " ▌lowvideo▐   Selecciona salida de caracteres en ventana de texto en baja"
  13289. " ▀▀▀▀▀▀▀▀▀▀   intensidad."
  13290. ""
  13291. " Sintaxis:"
  13292. "   void lowvideo (void);"
  13293. ""
  13294. "Afecta a la salida subsiguiente escritas con funcines de ventana de texto"
  13295. "tales como putch() y cprintf()."
  13296. ""
  13297. ""
  13298. " ▄▄▄▄▄▄▄▄▄▄"
  13299. " ▌movetext▐   Copia texto en pantalla de un rectángulo a otro (en modo"
  13300. " ▀▀▀▀▀▀▀▀▀▀   texto)."
  13301. ""
  13302. " Sintaxis:"
  13303. "   int movetext (int izq, int ar, int der, int ab, int izqdest, int ardest);"
  13304. ""
  13305. "Las coordenadas son relativas a la esquina superior izquierda de la"
  13306. "pantalla (1,1)."
  13307. ""
  13308. "Devuelve un valor distinto de cero si la operación tuvo éxito."
  13309. ""
  13310. ""
  13311. " ▄▄▄▄▄▄▄▄▄▄▄"
  13312. " ▌normvideo▐   Selecciona caracteres en intensidad normal."
  13313. " ▀▀▀▀▀▀▀▀▀▀▀"
  13314. ""
  13315. " Sintaxis:"
  13316. "   void normvideo (void);"
  13317. ""
  13318. "Afecta a la salida subsecuente de funciones de ventana de texto tales como"
  13319. "putch() y cprintf()."
  13320. ""
  13321. ""
  13322. " ▄▄▄▄▄▄▄"
  13323. " ▌putch▐   Escribe un carácter en la ventana de texto sobre en la pantalla."
  13324. " ▀▀▀▀▀▀▀"
  13325. ""
  13326. " Sintaxis:"
  13327. "   int putch (int ch);"
  13328. ""
  13329. "Usa el color y atributo de visualización actuales."
  13330. ""
  13331. "Devuelve ch, el carácter visualizado. En caso de error, devuelve EOF."
  13332. ""
  13333. ""
  13334. " ▄▄▄▄▄▄▄▄▄"
  13335. " ▌puttext▐   Copia texto de memoria a la pantalla."
  13336. " ▀▀▀▀▀▀▀▀▀"
  13337. ""
  13338. " Sintaxis:"
  13339. "   int puttext (int izq, int ar, int der, int ab, void *fuente);"
  13340. ""
  13341. "Las coordenadas son coordenadas de pantalla absoluta, no relativas a la"
  13342. "ventana actual. La esquina superior izquierda es (1,1)."
  13343. ""
  13344. "Devuelve un valor distinto de cero si tiene éxito."
  13345. ""
  13346. ""
  13347. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13348. " ▌_setcursortype▐   Selecciona la apariencia del cursor."
  13349. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13350. ""
  13351. " Sintaxis:"
  13352. "   void _setcursortype (int t_cur);"
  13353. ""
  13354. "El tipo de cursor t_cur puede ser"
  13355. ""
  13356. "  _NOCURSOR        el cursor no se ve"
  13357. "  _SOLIDCURSOR     bloque sólido"
  13358. "  _NORMALCURSOR    cursor compuesto de varias líneas inferiores"
  13359. ""
  13360. ""
  13361. " ▄▄▄▄▄▄▄▄▄▄"
  13362. " ▌textattr▐   Pone los atributos de texto para las funciones de ventana de"
  13363. " ▀▀▀▀▀▀▀▀▀▀   texto."
  13364. ""
  13365. " Sintaxis:"
  13366. "   void textattr(int newattr);"
  13367. ""
  13368. ""
  13369. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13370. " ▌textbackground▐   Selecciona nuevo color de fondo de los caracteres en"
  13371. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   modo texto."
  13372. ""
  13373. " Sintaxis:"
  13374. "   void textbackground (int nuevocolor);"
  13375. ""
  13376. ""
  13377. " ▄▄▄▄▄▄▄▄▄▄▄"
  13378. " ▌textcolor▐   Selecciona nuevo color de texto de los caracteres en modo"
  13379. " ▀▀▀▀▀▀▀▀▀▀▀   texto."
  13380. ""
  13381. " Sintaxis:"
  13382. "   void textcolor (int nuevocolor);"
  13383. ""
  13384. ""
  13385. " ▄▄▄▄▄▄▄▄▄▄"
  13386. " ▌textmode▐   Cambia modo de pantalla (en modo texto)."
  13387. " ▀▀▀▀▀▀▀▀▀▀"
  13388. ""
  13389. " Sintaxis:"
  13390. "   void textmode (int nuevomodo);"
  13391. ""
  13392. "No sirve para cambiar de modo gráfico a modo texto."
  13393. ""
  13394. ""
  13395. " ▄▄▄▄▄▄▄▄▄"
  13396. " ▌ungetch▐   Devuelve un carácter al teclado."
  13397. " ▀▀▀▀▀▀▀▀▀"
  13398. ""
  13399. " Sintaxis:"
  13400. "   int ungetch (int ch);"
  13401. ""
  13402. "La próxima llamada a getch() o cualquier otra función de entrada de consola"
  13403. "devolverá ch."
  13404. ""
  13405. "Devuelve el carácter ch si tiene éxito. Si devuelve EOF, indica que hubo"
  13406. "un error."
  13407. ""
  13408. ""
  13409. " ▄▄▄▄▄▄▄▄"
  13410. " ▌wherex▐   Devuelve posición horizontal del cursor dentro de la ventana"
  13411. " ▀▀▀▀▀▀▀▀   de texto corriente."
  13412. ""
  13413. " Sintaxis:"
  13414. "   int wherex (void);"
  13415. ""
  13416. "Devuelve un entero en el rango de 1 a 80."
  13417. ""
  13418. ""
  13419. " ▄▄▄▄▄▄▄▄"
  13420. " ▌wherey▐   Devuelve posición vertical del cursor dentro de la ventana"
  13421. " ▀▀▀▀▀▀▀▀   de texto corriente."
  13422. ""
  13423. " Sintaxis:"
  13424. "   int wherey (void);"
  13425. ""
  13426. "Devuelve un entero en el rango de 1 a 25."
  13427. ""
  13428. ""
  13429. " ▄▄▄▄▄▄▄▄"
  13430. " ▌window▐   Define ventana activa en modo texto."
  13431. " ▀▀▀▀▀▀▀▀"
  13432. ""
  13433. " Sintaxis:"
  13434. "   void window (int izq, int ar, int der, int ab);"
  13435. ""
  13436. "La esquina superior izquierda de la pantalla es (1,1)."
  13437. ""
  13438. ""
  13439. "CONSTANTES, TIPOS DE DATOS, Y VARIABLES GLOBALES:"
  13440. "*************************************************"
  13441. ""
  13442. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13443. "  COLORS (enum)"
  13444. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13445. ""
  13446. "Colores/atributos del vídeo CGA estándar."
  13447. ""
  13448. "  BLACK       DARKGRAY"
  13449. "  BLUE        LIGHTBLUE"
  13450. "  GREEN       LIGHTGREEN"
  13451. "  CYAN        LIGHTCYAN"
  13452. "  RED         LIGHTRED"
  13453. "  MAGENTA     LIGHTMAGENTA"
  13454. "  BROWN       YELLOW"
  13455. "  LIGHTGRAY   WHITE"
  13456. ""
  13457. ""
  13458. " ▄▄▄▄▄▄▄"
  13459. "  BLINK"
  13460. " ▀▀▀▀▀▀▀"
  13461. ""
  13462. "Esta constante se le suma a color de fondo para visualizar caracteres"
  13463. "parpadeantes en modo texto."
  13464. ""
  13465. ""
  13466. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13467. "  directvideo (variable gloval)"
  13468. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13469. ""
  13470. "Controla salida de vídeo."
  13471. ""
  13472. "  int directvideo;"
  13473. ""
  13474. "La variable global directvideo controla si la salida en consola de nuestro"
  13475. "programa va directamente a la RAM de vídeo (directvideo = 1) o va vía lla-"
  13476. "madas a la ROM BIOS (directvideo = 0)."
  13477. ""
  13478. "El valor por defecto es directvideo = 1 (salida a consola va directamente"
  13479. "a RAM de vídeo)."
  13480. ""
  13481. "Para usar directvideo = 1, el hardware de vídeo de nuestro sistema debe ser"
  13482. "idéntico a los adaptadores de visualización de IBM."
  13483. ""
  13484. "Poner directvideo = 0 permite que la salida a consola trabaje con cualquier"
  13485. "sistema que sea compatible a nivel BIOS con IBM."
  13486. ""
  13487. ""
  13488. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13489. "  TEXT_INFO (struct)"
  13490. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13491. ""
  13492. "Información de ventana de texto corriente."
  13493. ""
  13494. "  struct text_info"
  13495. "    {"
  13496. "      unsigned char  winleft,   wintop;"
  13497. "      unsigned char  winright,  winbottom;"
  13498. "      unsigned char  attribute, normattr;"
  13499. "      unsigned char  currmode;"
  13500. "      unsigned char  screenheight;"
  13501. "      unsigned char  screenwidth;"
  13502. "      unsigned char  curx, cury;"
  13503. "    };"
  13504. ""
  13505. ""
  13506. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13507. "  text_modes (enum)"
  13508. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13509. ""
  13510. "Modos de vídeo estándar."
  13511. ""
  13512. "  LASTMODE   BW80"
  13513. "  BW40       C80"
  13514. "  C40        C4350"
  13515. "  MONO"
  13516. ""
  13517. ""
  13518. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13519. "  _wscroll (variable global)"
  13520. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13521. ""
  13522. "Habilita o desahibilita el scroll en funciones de E/S de consola."
  13523. ""
  13524. "  extern int_wscroll;"
  13525. ""
  13526. "La variable global _wscroll es un flag (bandera) de E/S de consola. Podemos"
  13527. "usarla para dibujar entre los ojos de una ventana sin provocar un scroll de"
  13528. "la pantalla."
  13529. ""
  13530. "El valor por defecto es _wscroll = 1 (scroll permitido)."
  13531. ""
  13532. ""
  13533. "NOTA: En el ejemplo 3 de esta lección se muestra cómo se pueden utilizar"
  13534. "estas funciones en un programa"
  13535. ""
  13536. endvis
  13537. beginvis
  13538. no_multiatributo
  13539. cabecera " FICHERO DE CABECERA GRAPHICS.H (TC) "
  13540. coordenadas_completas 1 2 80 24
  13541. color 0 3
  13542. borde 2
  13543. "GLOSARIO:"
  13544. "*********"
  13545. ""
  13546. " ▄▄▄▄▄"
  13547. " ▌arc▐   Dibuja un arco."
  13548. " ▀▀▀▀▀"
  13549. " ▄▄▄▄▄"
  13550. " ▌bar▐   Dibuja una barra."
  13551. " ▀▀▀▀▀"
  13552. " ▄▄▄▄▄▄▄"
  13553. " ▌bar3d▐   Dibuja una barra en 3-D."
  13554. " ▀▀▀▀▀▀▀"
  13555. " ▄▄▄▄▄▄▄▄"
  13556. " ▌circle▐   Dibuja un círculo en (x,y) con el radio dado."
  13557. " ▀▀▀▀▀▀▀▀"
  13558. " ▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13559. " ▌cleardevice▐   Borra la pantalla gráfica."
  13560. " ▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13561. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13562. " ▌clearviewport▐   Borra el viewport corriente."
  13563. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13564. " ▄▄▄▄▄▄▄▄▄▄▄▄"
  13565. " ▌closegraph▐   Cierra el sistema gráfico."
  13566. " ▀▀▀▀▀▀▀▀▀▀▀▀"
  13567. " ▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13568. " ▌detectgraph▐   Determina el controlador y el modo gráfico a usar"
  13569. " ▀▀▀▀▀▀▀▀▀▀▀▀▀   chequenado el hardware"
  13570. " ▄▄▄▄▄▄▄▄▄▄"
  13571. " ▌drawpoly▐   Dibuja un polígono."
  13572. " ▀▀▀▀▀▀▀▀▀▀"
  13573. " ▄▄▄▄▄▄▄▄▄"
  13574. " ▌ellipse▐   Dibuja un arco elíptico."
  13575. " ▀▀▀▀▀▀▀▀▀"
  13576. " ▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13577. " ▌fillellipse▐   Dibuja y rellena una elipse."
  13578. " ▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13579. " ▄▄▄▄▄▄▄▄▄▄"
  13580. " ▌fillpoly▐   Dibuja y rellena un polígono."
  13581. " ▀▀▀▀▀▀▀▀▀▀"
  13582. " ▄▄▄▄▄▄▄▄▄▄▄"
  13583. " ▌floodfill▐   Rellena una región definida."
  13584. " ▀▀▀▀▀▀▀▀▀▀▀"
  13585. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13586. " ▌getarccoords▐   Obtiene las coordenadas de la última llamada a arc."
  13587. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13588. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13589. " ▌getaspectratio▐   Obtiene la cuadratura para el modo gráfico corriente."
  13590. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13591. " ▄▄▄▄▄▄▄▄▄▄▄▄"
  13592. " ▌getbkcolor▐   Devuelve el color de fondo actual."
  13593. " ▀▀▀▀▀▀▀▀▀▀▀▀"
  13594. " ▄▄▄▄▄▄▄▄▄▄"
  13595. " ▌getcolor▐   Devuelve el color de dibujar actual."
  13596. " ▀▀▀▀▀▀▀▀▀▀"
  13597. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13598. " ▌getdefaultpalette▐   Devuelve la estructura de definición de paleta."
  13599. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13600. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13601. " ▌getdrivername▐   Devuelve un puntero al nombre del controlador gráfico"
  13602. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   actual."
  13603. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13604. " ▌getfillpattern▐   Copia un patrón de relleno definido por el usuario en"
  13605. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   memoria."
  13606. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13607. " ▌getfillsettings▐   Obtiene información acerca del patrón y color de"
  13608. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   relleno actual."
  13609. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13610. " ▌getgraphmode▐   Devuelve el modo gráfico actual."
  13611. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13612. " ▄▄▄▄▄▄▄▄▄▄"
  13613. " ▌getimage▐   Salva una imagen de la región especificada en memoria."
  13614. " ▀▀▀▀▀▀▀▀▀▀"
  13615. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13616. " ▌getlinesettings▐   Obtiene el estilo, patrón y grosor actual de línea."
  13617. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13618. " ▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13619. " ▌getmaxcolor▐   Devuelve el valor del color máximo."
  13620. " ▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13621. " ▄▄▄▄▄▄▄▄▄▄▄▄"
  13622. " ▌getmaxmode▐   Devuelve el número de modo gráfico máximo para el"
  13623. " ▀▀▀▀▀▀▀▀▀▀▀▀   controlador corriente."
  13624. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13625. " ▌getmaxx and getmaxy▐   Devuelve la coordenada x o y máxima de pantalla."
  13626. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13627. " ▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13628. " ▌getmodename▐   Devuelve un puntero a una cadena que contiene el nombre"
  13629. " ▀▀▀▀▀▀▀▀▀▀▀▀▀   del modo gráfico especificado."
  13630. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13631. " ▌getmoderange▐   Obtiene el rango de los modos para un controlador"
  13632. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀   gráfico dado."
  13633. " ▄▄▄▄▄▄▄▄▄▄▄▄"
  13634. " ▌getpalette▐   Obtiene información acerca de la paleta actual."
  13635. " ▀▀▀▀▀▀▀▀▀▀▀▀"
  13636. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13637. " ▌getpalettesize▐   Devuelve el número de entradas de la paleta."
  13638. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13639. " ▄▄▄▄▄▄▄▄▄▄"
  13640. " ▌getpixel▐   Obtiene el color de un pixel especificado."
  13641. " ▀▀▀▀▀▀▀▀▀▀"
  13642. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13643. " ▌gettextsettings▐   Obtiene información acerca de las características del"
  13644. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   texto gráfico actual."
  13645. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13646. " ▌getviewsettings▐   Obtiene información acerca del viewport actual."
  13647. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13648. " ▄▄▄▄▄▄"
  13649. " ▌getx▐   Devuelve la coordenada x de la posición actual."
  13650. " ▀▀▀▀▀▀"
  13651. " ▄▄▄▄▄▄"
  13652. " ▌gety▐   Devuelve la coordenada y de la posición actual."
  13653. " ▀▀▀▀▀▀"
  13654. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13655. " ▌graphdefaults▐   Pone todos los valores gráficos a sus valores por defecto."
  13656. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13657. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13658. " ▌grapherrormsg▐   Devuelve un puntero a una cadena con el mensaje de error."
  13659. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13660. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13661. " ▌_graphfreemem▐   Manejador de usuario para desasignar memoria gráfica."
  13662. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13663. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13664. " ▌_graphgetmem▐   Manejador de usuario para asignar memoria gráfica."
  13665. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13666. " ▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13667. " ▌graphresult▐   Devuelve un código de error para la última operación"
  13668. " ▀▀▀▀▀▀▀▀▀▀▀▀▀   gráfica que no tuvo éxito."
  13669. " ▄▄▄▄▄▄▄▄▄▄▄"
  13670. " ▌imagesize▐   Devuelve el número de bytes requeridos para almacenar"
  13671. " ▀▀▀▀▀▀▀▀▀▀▀   una imagen."
  13672. " ▄▄▄▄▄▄▄▄▄▄▄"
  13673. " ▌initgraph▐   Inicializa el sistema gráfico."
  13674. " ▀▀▀▀▀▀▀▀▀▀▀"
  13675. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13676. " ▌installuserdriver▐   Instala un nuevo controlador de dispositivo a la"
  13677. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   tabla de controladores de dispotivo BGI."
  13678. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13679. " ▌installuserfont▐   Carga un fichero de estilo de caracteres (.CHR) que no"
  13680. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   está dentro del sistema BGI."
  13681. " ▄▄▄▄▄▄"
  13682. " ▌line▐   Dibuja una línea entre dos puntos especificados."
  13683. " ▀▀▀▀▀▀"
  13684. " ▄▄▄▄▄▄▄▄▄"
  13685. " ▌linerel▐   Dibuja una línea a una distancia relativa a la posición actual."
  13686. " ▀▀▀▀▀▀▀▀▀"
  13687. " ▄▄▄▄▄▄▄▄"
  13688. " ▌lineto▐   Dibuja una línea desde la posición actual hasta (x,y)."
  13689. " ▀▀▀▀▀▀▀▀"
  13690. " ▄▄▄▄▄▄▄▄▄"
  13691. " ▌moverel▐   Cambia la posición actual a una distancia relativa."
  13692. " ▀▀▀▀▀▀▀▀▀"
  13693. " ▄▄▄▄▄▄▄▄"
  13694. " ▌moveto▐   Cambia la posición actual a (x,y)."
  13695. " ▀▀▀▀▀▀▀▀"
  13696. " ▄▄▄▄▄▄▄▄▄"
  13697. " ▌outtext▐   Visualiza una cadena en el viewport (modo gráfico)."
  13698. " ▀▀▀▀▀▀▀▀▀"
  13699. " ▄▄▄▄▄▄▄▄▄▄▄"
  13700. " ▌outtextxy▐   Visualiza una cadena en el lugar especificado (modo gráfico)."
  13701. " ▀▀▀▀▀▀▀▀▀▀▀"
  13702. " ▄▄▄▄▄▄▄▄▄▄"
  13703. " ▌pieslice▐   Dibuja y rellena un sector de círculo."
  13704. " ▀▀▀▀▀▀▀▀▀▀"
  13705. " ▄▄▄▄▄▄▄▄▄▄"
  13706. " ▌putimage▐   Escribe una imagen en la pantalla."
  13707. " ▀▀▀▀▀▀▀▀▀▀"
  13708. " ▄▄▄▄▄▄▄▄▄▄"
  13709. " ▌putpixel▐   Escribe un pixel en el punto especificado."
  13710. " ▀▀▀▀▀▀▀▀▀▀"
  13711. " ▄▄▄▄▄▄▄▄▄▄▄"
  13712. " ▌rectangle▐   Dibuja un rectángulo (modo gráfico)."
  13713. " ▀▀▀▀▀▀▀▀▀▀▀"
  13714. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13715. " ▌registerbgidriver▐   Registra controlador gráfico en el enlazado."
  13716. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13717. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13718. " ▌registerbgifont▐   Registra estilo de texto en el enlazado."
  13719. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13720. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13721. " ▌restorecrtmode▐   Restaura modo de pantalla previa a entrar al modo"
  13722. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   gráfico."
  13723. " ▄▄▄▄▄▄▄▄"
  13724. " ▌sector▐   Dibuja y rellena un sector elíptico."
  13725. " ▀▀▀▀▀▀▀▀"
  13726. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13727. " ▌setactivepage▐   Pone la página activa para la salida gráfica."
  13728. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13729. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13730. " ▌setallpalette▐   Cambia los colores de todas las paletas."
  13731. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13732. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13733. " ▌setaspectratio▐   Pone la cuadratura gráfica"
  13734. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13735. " ▄▄▄▄▄▄▄▄▄▄▄▄"
  13736. " ▌setbkcolor▐   Pone el color de fondo actual usando la paleta."
  13737. " ▀▀▀▀▀▀▀▀▀▀▀▀"
  13738. " ▄▄▄▄▄▄▄▄▄▄"
  13739. " ▌setcolor▐   Pone el color actual para dibujar."
  13740. " ▀▀▀▀▀▀▀▀▀▀"
  13741. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13742. " ▌setfillpattern▐   Selecciona un patrón de relleno definido por el usuario."
  13743. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13744. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13745. " ▌setfillstyle▐   Pone el patrón y color de relleno."
  13746. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13747. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13748. " ▌setgraphbufsize▐   Cambia el tamaño del buffer gráfico interno."
  13749. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13750. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13751. " ▌setgraphmode▐   Pone el sistema en modo gráfico y borra la pantalla."
  13752. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13753. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13754. " ▌setlinestyle▐   Pone el estilo de línea, anchura y patrón actual."
  13755. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13756. " ▄▄▄▄▄▄▄▄▄▄▄▄"
  13757. " ▌setpalette▐   Cambia un color de la paleta."
  13758. " ▀▀▀▀▀▀▀▀▀▀▀▀"
  13759. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13760. " ▌setrgbpalette▐   Define colores para la tarjeta gráfica IBM-8514."
  13761. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13762. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13763. " ▌settextjustify▐   Pone justificación de texto para modo gráfico."
  13764. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13765. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13766. " ▌settextstyle▐   Pone las características actuales del texto."
  13767. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13768. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13769. " ▌setusercharsize▐   Factor de amplificacion de los caracteres definidos"
  13770. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   por el usuario para los estilos de caracteres."
  13771. " ▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13772. " ▌setviewport▐   Pone el viewport actual para salida gráfica."
  13773. " ▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13774. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13775. " ▌setvisualpage▐   Pone el número de página gráfica visual."
  13776. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13777. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13778. " ▌setwritemode▐   Pone el modo de escritura para el dibujo de líneas en modo"
  13779. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀   gráfico."
  13780. " ▄▄▄▄▄▄▄▄▄▄▄▄"
  13781. " ▌textheight▐   Devuelve la altura de una cadena en pixels."
  13782. " ▀▀▀▀▀▀▀▀▀▀▀▀"
  13783. " ▄▄▄▄▄▄▄▄▄▄▄"
  13784. " ▌textwidth▐   Devuelve la anchura de una cadena en pixels."
  13785. " ▀▀▀▀▀▀▀▀▀▀▀"
  13786. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13787. "  ARCCOORDSTYPE (struct)    Coordenadas de la última llamada a arc()."
  13788. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13789. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13790. "  EGA_xxxx (#defines)    Colores para las funciones setpalette() y "
  13791. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   setallpalette()."
  13792. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13793. "  fill_patterns (enum)    Patrones de relleno para las funciones"
  13794. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   getfillsettings() y setfillstyle()."
  13795. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13796. "  FILLSETTINGSTYPE (struct)    Usado para obtener los valores de relleno"
  13797. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   actuales por la función getfillsettings()."
  13798. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13799. "  font_names (enum)      Nombres de estilos de texto."
  13800. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13801. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13802. "  graphics_drivers (enum)     Controladores gráficos BGI."
  13803. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13804. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13805. "  graphics_errors (enum)     Códigos de error devueltos por graphresult()."
  13806. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13807. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13808. "  graphics_modes (enum)     Modos gráficos para cada controlador BGI."
  13809. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13810. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13811. "  line_styles (enum)     Estilos de línea para las funciones"
  13812. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀    getlinesettings() y setlinestyle()."
  13813. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13814. "  line_widths (enum)     Anchuras de las líneas para las funciones"
  13815. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀    getlinesettings() y setlinestyle()."
  13816. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13817. "  MAXCOLORS (#define)     Define el número máximo de colores para la "
  13818. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀    estructura palettetype. "
  13819. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄  Información de la paleta para el controlador"
  13820. "  PALETTETYPE (struct)   gráfico actual utilizado por las funciones"
  13821. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀  getpalette(), setpalette() y setallpalette()."
  13822. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13823. "  POINTTYPE (struct)    Coordenadas de un punto."
  13824. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13825. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13826. "  putimage_ops (enum)     Operadores para putimage()."
  13827. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13828. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13829. "  text_just (enum)     Justificación horizontal y vertical para la función"
  13830. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀    settextjustify()."
  13831. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13832. "  *_DIR (Dirección) (#defines)     Dirección para la salida gráfica."
  13833. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13834. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13835. "  TEXTSETTINGSTYPE (struct)   Usado para obtener los valores de texto actual"
  13836. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀  por la función gettextsettings()."
  13837. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13838. "  USER_CHAR_SIZE (#define)     Tamaño de los caracteres definidos por el"
  13839. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀    usuario."
  13840. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13841. "  VIEWPORTTYPE (struct)   Estructura usada para obtener información sobre el"
  13842. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀  viewport actual por la función getviewsettings()."
  13843. ""
  13844. ""
  13845. "FUNCIONES:"
  13846. "**********"
  13847. ""
  13848. " ▄▄▄▄▄"
  13849. " ▌arc▐   Dibuja un arco."
  13850. " ▀▀▀▀▀"
  13851. ""
  13852. " Sintaxis:"
  13853. "   void far arc (int x, int y, int ang_comienzo, int ang_final, int radio);"
  13854. ""
  13855. "(x,y) es el punto central; ang_comienzo y ang_final son los ángulos de"
  13856. "comienzo y final en grados; radio es el radio."
  13857. ""
  13858. ""
  13859. " ▄▄▄▄▄"
  13860. " ▌bar▐   Dibuja una barra."
  13861. " ▀▀▀▀▀"
  13862. ""
  13863. " Sintaxix:"
  13864. "   void far bar (int izq, int ar, int der, int ab);"
  13865. ""
  13866. ""
  13867. " ▄▄▄▄▄▄▄"
  13868. " ▌bar3d▐   Dibuja una barra en 3-D."
  13869. " ▀▀▀▀▀▀▀"
  13870. ""
  13871. " Sintaxis:"
  13872. "   void far bar3d (int izq, int ar, int der, int ab, int profundidad,"
  13873. "                   int flag_de_encima);"
  13874. ""
  13875. "Si flag_de_encima es 0 no se dibuja la cara superior de la barra."
  13876. ""
  13877. ""
  13878. " ▄▄▄▄▄▄▄▄"
  13879. " ▌circle▐   Dibuja un círculo en (x,y) con el radio dado."
  13880. " ▀▀▀▀▀▀▀▀"
  13881. ""
  13882. " Sintaxis:"
  13883. "   void far circle (int x, int y, int radio);"
  13884. ""
  13885. ""
  13886. " ▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13887. " ▌cleardevice▐   Borra la pantalla gráfica."
  13888. " ▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13889. ""
  13890. " Sintaxis:"
  13891. "   void far cleardevice (void);"
  13892. ""
  13893. ""
  13894. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13895. " ▌clearviewport▐   Borra el viewport corriente."
  13896. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13897. ""
  13898. " Sintaxis:"
  13899. "   void far clearviewport (void);"
  13900. ""
  13901. ""
  13902. " ▄▄▄▄▄▄▄▄▄▄▄▄"
  13903. " ▌closegraph▐   Cierra el sistema gráfico."
  13904. " ▀▀▀▀▀▀▀▀▀▀▀▀"
  13905. ""
  13906. " Sintaxis:"
  13907. "   void far closegraph (void);"
  13908. ""
  13909. ""
  13910. " ▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13911. " ▌detectgraph▐   Determina el controlador y el modo gráfico a usar"
  13912. " ▀▀▀▀▀▀▀▀▀▀▀▀▀   chequenado el hardware"
  13913. ""
  13914. " Sintaxis:"
  13915. "   void far detectgraph (int far *graphdriver, int far *graphmode);"
  13916. ""
  13917. ""
  13918. " ▄▄▄▄▄▄▄▄▄▄"
  13919. " ▌drawpoly▐   Dibuja un polígono."
  13920. " ▀▀▀▀▀▀▀▀▀▀"
  13921. ""
  13922. " Sintaxis:"
  13923. "   void far drawpoly (int numero_de_puntos, int far *puntos_de_poligono);"
  13924. ""
  13925. "*puntos_de_poligono apunta a numero_de_puntos pares de valores. Cada par"
  13926. "da los valores de x e y para un punto del polígono."
  13927. ""
  13928. ""
  13929. " ▄▄▄▄▄▄▄▄▄"
  13930. " ▌ellipse▐   Dibuja un arco elíptico."
  13931. " ▀▀▀▀▀▀▀▀▀"
  13932. ""
  13933. " Sintaxis:"
  13934. "   void far ellipse (int x, int y, int ang_comienzo, int ang_final,"
  13935. "                     int radiox, int radioy);"
  13936. ""
  13937. "(x,y) es el punto central; ang_comienzo y ang_final son los ángulos de"
  13938. "comienzo y final en grados; radiox y radioy son los radios horizontal y"
  13939. "vertical."
  13940. ""
  13941. ""
  13942. " ▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13943. " ▌fillellipse▐   Dibuja y rellena una elipse."
  13944. " ▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13945. ""
  13946. " Sintaxis:"
  13947. "   void far fillellipse (int x, int y, int radiox, int radioy);"
  13948. ""
  13949. "Usa (x,y) como el punto central y rellena el arco usando el patrón de"
  13950. "relleno actual; radiox y radioy son los radios horizontal y vertical."
  13951. ""
  13952. ""
  13953. " ▄▄▄▄▄▄▄▄▄▄"
  13954. " ▌fillpoly▐   Dibuja y rellena un polígono."
  13955. " ▀▀▀▀▀▀▀▀▀▀"
  13956. ""
  13957. " Sintaxis:"
  13958. "   void far fillpoly(int numpoints, int far *polypoints[]);"
  13959. ""
  13960. "*puntos_de_poligono apunta a numero_de_puntos pares de valores. Cada par"
  13961. "da los valores de x e y para un punto del polígono."
  13962. ""
  13963. ""
  13964. " ▄▄▄▄▄▄▄▄▄▄▄"
  13965. " ▌floodfill▐   Rellena una región definida."
  13966. " ▀▀▀▀▀▀▀▀▀▀▀"
  13967. ""
  13968. " Sintaxis:"
  13969. "   void far floodfill (int x, int y, int color_borde);"
  13970. ""
  13971. "(x,y) es un punto que reside dentro de la región a rellenar."
  13972. ""
  13973. ""
  13974. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13975. " ▌getarccoords▐   Obtiene las coordenadas de la última llamada a arc."
  13976. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13977. ""
  13978. " Sintaxis:"
  13979. "   void far getarccoords (struct arccoordstype far *coords_arc);"
  13980. ""
  13981. ""
  13982. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  13983. " ▌getaspectratio▐   Obtiene la cuadratura para el modo gráfico corriente."
  13984. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  13985. ""
  13986. " Sintaxis:"
  13987. "   void far getaspectratio (int far *cuadx, int far *cuady);"
  13988. ""
  13989. "cuadx debería ser 10000. Usa cuadx=10000 cuando los pixels son cuadrados"
  13990. "(VGA); <10000 para pixels altos."
  13991. ""
  13992. ""
  13993. " ▄▄▄▄▄▄▄▄▄▄▄▄"
  13994. " ▌getbkcolor▐   Devuelve el color de fondo actual."
  13995. " ▀▀▀▀▀▀▀▀▀▀▀▀"
  13996. ""
  13997. " Sintaxis:"
  13998. "   int far getbkcolor (void);"
  13999. ""
  14000. ""
  14001. " ▄▄▄▄▄▄▄▄▄▄"
  14002. " ▌getcolor▐   Devuelve el color de dibujar actual."
  14003. " ▀▀▀▀▀▀▀▀▀▀"
  14004. ""
  14005. " Sintaxis:"
  14006. "   int far getcolor (void);"
  14007. ""
  14008. ""
  14009. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14010. " ▌getdefaultpalette▐   Devuelve la estructura de definición de paleta."
  14011. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  14012. ""
  14013. " Sintaxis:"
  14014. "   struct palettetype *far getdefaultpalette (void);"
  14015. ""
  14016. "Devuelve un puntero a la estructura de paleta por defecto para el"
  14017. "controlador actual inicializado mediante una llamada a initgraph()."
  14018. ""
  14019. ""
  14020. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14021. " ▌getdrivername▐   Devuelve un puntero al nombre del controlador gráfico"
  14022. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   actual."
  14023. ""
  14024. " Sintaxis:"
  14025. "   char *far getdrivername(void);"
  14026. ""
  14027. "El puntero far devuelto apunta a una cadena que identifica el controlador"
  14028. "gráfico actual."
  14029. ""
  14030. ""
  14031. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14032. " ▌getfillpattern▐   Copia un patrón de relleno definido por el usuario en"
  14033. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   memoria."
  14034. ""
  14035. " Sintaxis:"
  14036. "   void far getfillpattern (char far *patron);"
  14037. ""
  14038. ""
  14039. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14040. " ▌getfillsettings▐   Obtiene información acerca del patrón y color de"
  14041. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   relleno actual."
  14042. ""
  14043. " Sintaxis:"
  14044. "   void far getfillsettings (struct fillsettingstype far *fillinfo);"
  14045. ""
  14046. ""
  14047. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14048. " ▌getgraphmode▐   Devuelve el modo gráfico actual."
  14049. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  14050. ""
  14051. " Sintaxis:"
  14052. "   int far getgraphmode (void);"
  14053. ""
  14054. "Antes de llamar a getgraphmode() se debe llamar a initgraph() o"
  14055. "setgraphmode()."
  14056. ""
  14057. ""
  14058. " ▄▄▄▄▄▄▄▄▄▄"
  14059. " ▌getimage▐   Salva una imagen de la región especificada en memoria."
  14060. " ▀▀▀▀▀▀▀▀▀▀"
  14061. ""
  14062. " Sintaxis:"
  14063. "   void far getimage(int izq, int ar, int der, int ab, void far *bitmap);"
  14064. ""
  14065. ""
  14066. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14067. " ▌getlinesettings▐   Obtiene el estilo, patrón y grosor actual de línea."
  14068. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  14069. ""
  14070. " Sintaxis:"
  14071. "   void far getlinesettings (struct linesettingstype far *infolinea);"
  14072. ""
  14073. ""
  14074. " ▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14075. " ▌getmaxcolor▐   Devuelve el valor del color máximo."
  14076. " ▀▀▀▀▀▀▀▀▀▀▀▀▀"
  14077. ""
  14078. " Sintaxis:"
  14079. "   int far getmaxcolor(void);"
  14080. ""
  14081. ""
  14082. " ▄▄▄▄▄▄▄▄▄▄▄▄"
  14083. " ▌getmaxmode▐   Devuelve el número de modo gráfico máximo para el"
  14084. " ▀▀▀▀▀▀▀▀▀▀▀▀   controlador corriente."
  14085. ""
  14086. " Sintaxis:"
  14087. "   int far getmaxmode (void);"
  14088. ""
  14089. "El modo mínimo es 0."
  14090. ""
  14091. ""
  14092. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14093. " ▌getmaxx and getmaxy▐   Devuelve la coordenada x o y máxima de pantalla."
  14094. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  14095. ""
  14096. " Sintaxis:"
  14097. "   int far getmaxx(void);"
  14098. "   int far getmaxy(void);"
  14099. ""
  14100. ""
  14101. " ▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14102. " ▌getmodename▐   Devuelve un puntero a una cadena que contiene el nombre"
  14103. " ▀▀▀▀▀▀▀▀▀▀▀▀▀   del modo gráfico especificado."
  14104. ""
  14105. " Sintaxis:"
  14106. "   char * far getmodename (int numero_de_modo);"
  14107. ""
  14108. "El puntero devuelto apunta al nombre (cadena) del modo especificado por"
  14109. "numero_de_modo."
  14110. ""
  14111. ""
  14112. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14113. " ▌getmoderange▐   Obtiene el rango de los modos para un controlador"
  14114. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀   gráfico dado."
  14115. ""
  14116. " Sintaxis:"
  14117. "   void far getmoderange (int controlador_grafico, int far *mode_bajo,"
  14118. "                          int far *mode_alto);"
  14119. ""
  14120. ""
  14121. " ▄▄▄▄▄▄▄▄▄▄▄▄"
  14122. " ▌getpalette▐   Obtiene información acerca de la paleta actual."
  14123. " ▀▀▀▀▀▀▀▀▀▀▀▀"
  14124. ""
  14125. " Sintaxis:"
  14126. "   void far getpalette (struct palettetype far *paleta);"
  14127. ""
  14128. ""
  14129. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14130. " ▌getpalettesize▐   Devuelve el número de entradas de la paleta."
  14131. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  14132. ""
  14133. " Sintaxis:"
  14134. "   int far getpalettesize (void);"
  14135. ""
  14136. "Devuelve el número de entradas de la paleta permitidas para el modo de"
  14137. "controlador gráfico actual."
  14138. ""
  14139. ""
  14140. " ▄▄▄▄▄▄▄▄▄▄"
  14141. " ▌getpixel▐   Obtiene el color de un pixel especificado."
  14142. " ▀▀▀▀▀▀▀▀▀▀"
  14143. ""
  14144. " Sintaxis:"
  14145. "   unsigned far getpixel (int x, int y);"
  14146. ""
  14147. ""
  14148. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14149. " ▌gettextsettings▐   Obtiene información acerca de las características del"
  14150. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   "texto gráfico actual."
  14151. ""
  14152. " Sintaxis:"
  14153. "   void far gettextsettings (struct textsettingstype far *texttypeinfo);"
  14154. ""
  14155. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14156. " ▌getviewsettings▐   Obtiene información acerca del viewport actual."
  14157. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  14158. ""
  14159. " Sintaxis:"
  14160. "   void far getviewsettings (struct viewporttype far *viewport);"
  14161. ""
  14162. ""
  14163. " ▄▄▄▄▄▄"
  14164. " ▌getx▐   Devuelve la coordenada x de la posición actual."
  14165. " ▀▀▀▀▀▀"
  14166. ""
  14167. " Sintaxis:"
  14168. "   int far getx (void);"
  14169. ""
  14170. "El valor es relativo al viewport."
  14171. ""
  14172. ""
  14173. " ▄▄▄▄▄▄"
  14174. " ▌gety▐   Devuelve la coordenada y de la posición actual."
  14175. " ▀▀▀▀▀▀"
  14176. ""
  14177. " Sintaxis:"
  14178. "   int far gety (void);"
  14179. ""
  14180. "El valor es relativo al viewport."
  14181. ""
  14182. ""
  14183. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14184. " ▌graphdefaults▐   Pone todos los valores gráficos a sus valores por defecto."
  14185. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  14186. ""
  14187. " Sintaxis:"
  14188. "   void far graphdefaults (void);"
  14189. ""
  14190. ""
  14191. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14192. " ▌grapherrormsg▐   Devuelve un puntero a una cadena con el mensaje de error."
  14193. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  14194. ""
  14195. " Sintaxis:"
  14196. "   char *far grapherrormsg (int codigo_de_error);"
  14197. ""
  14198. "Devuelve un puntero a una cadena asociada con el valor devuelvto por"
  14199. "graphresult()."
  14200. ""
  14201. ""
  14202. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14203. " ▌_graphfreemem▐   Manejador de usuario para desasignar memoria gráfica."
  14204. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  14205. ""
  14206. "   void far _graphfreemem (void far *ptr, unsigned tamanio);"
  14207. ""
  14208. "Esta función es llamada por las rutinas que hay en la biblioteca gráfica"
  14209. "para liberar memoria. Podemos controlar esta asignación de memoria sumi-"
  14210. "nistrando nuestras propias funciones _graphgetmem() y _graphfreemen()."
  14211. ""
  14212. ""
  14213. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14214. " ▌_graphgetmem▐   Manejador de usuario para asignar memoria gráfica."
  14215. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  14216. ""
  14217. " Sintaxis:"
  14218. "   void far * far _graphgetmem (unsigned tamanio);"
  14219. ""
  14220. "Esta función es llamada por las rutinas que hay en la biblioteca gráfica"
  14221. "para asignar memoria. Podemos controlar esta asignación de memoria sumi-"
  14222. "nistrando nuestras propias funciones _graphgetmem() y _graphfreemen()."
  14223. ""
  14224. ""
  14225. " ▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14226. " ▌graphresult▐   Devuelve un código de error para la última operación"
  14227. " ▀▀▀▀▀▀▀▀▀▀▀▀▀   gráfica que no tuvo éxito."
  14228. ""
  14229. " Sintaxis:"
  14230. "   int far graphresult (void);"
  14231. ""
  14232. "Devuelve el código de error para la última operación gráfica que informó"
  14233. "de un error y pone el nivel de error a grOK."
  14234. ""
  14235. ""
  14236. " ▄▄▄▄▄▄▄▄▄▄▄"
  14237. " ▌imagesize▐   Devuelve el número de bytes requeridos para almacenar"
  14238. " ▀▀▀▀▀▀▀▀▀▀▀   una imagen."
  14239. ""
  14240. " Sintaxis:"
  14241. "   unsigned far imagesize (int izq, int ar, int der, int ab);"
  14242. ""
  14243. "Si el tamaño requerido para la imagen seleccionada es mayor o igual que 64K"
  14244. "- 1 bytes, imagesize() devuelve 0xFFFF."
  14245. ""
  14246. ""
  14247. " ▄▄▄▄▄▄▄▄▄▄▄"
  14248. " ▌initgraph▐   Inicializa el sistema gráfico."
  14249. " ▀▀▀▀▀▀▀▀▀▀▀"
  14250. ""
  14251. " Sintaxis:"
  14252. "   void far initgraph (int far *controlador_grafico, int far *modo_grafico,"
  14253. "                       char far *path_para_controlador);"
  14254. ""
  14255. "NOTA: El parámetro paht_para_controlador usa la sintaxis:"
  14256. ""
  14257. "  "..\\bgi\\drivers""
  14258. ""
  14259. "donde"
  14260. " ■ bgi\drivers el el nombre de directorio donde buscar los controladores"
  14261. " ■ el parámetro está encerrado entre comillas"
  14262. " ■ el path para los ficheros de controladores gráficos incluyen dos"
  14263. "   barras invertidas"
  14264. ""
  14265. ""
  14266. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14267. " ▌installuserdriver▐   Instala un nuevo controlador de dispositivo a la"
  14268. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   tabla de controladores de dispotivo BGI."
  14269. ""
  14270. " Sintaxis:"
  14271. "   int far installuserdriver (char far *nombre, int huge (*detect) (void));"
  14272. ""
  14273. "El parámetro nombre es el nombre del nuevo fichero de controlador de dispo-"
  14274. "sitivo (.BGI) y detect es un puntero a una función de autodetección opcional"
  14275. "que puede acompañar al nuevo controlador. Esta función de autodetección no"
  14276. "tiene ningún parámetro y devuelve un valor entero."
  14277. ""
  14278. ""
  14279. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14280. " ▌installuserfont▐   Carga un fichero de estilo de caracteres (.CHR) que no"
  14281. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   está dentro del sistema BGI."
  14282. ""
  14283. " Sintaxis:"
  14284. "   int far installuserfont (char far *nombre);"
  14285. ""
  14286. "El parámetro nombre es el nombre del fichero que contiene las"
  14287. "características del nuevo tipo de carácter en modo gráfico."
  14288. ""
  14289. "Al mismo tiempo pueden ser instalados hasta 20 estilos de caracteres."
  14290. ""
  14291. ""
  14292. " ▄▄▄▄▄▄"
  14293. " ▌line▐   Dibuja una línea entre dos puntos especificados."
  14294. " ▀▀▀▀▀▀"
  14295. ""
  14296. " Sintaxis:"
  14297. "   void far line (int x1, int y1, int x2, int y2);"
  14298. ""
  14299. "Dibuja una línea desde (x1,y1) hasta (x2,y2) usando el color, estilo de"
  14300. "línea y grosor actuales."
  14301. ""
  14302. ""
  14303. " ▄▄▄▄▄▄▄▄▄"
  14304. " ▌linerel▐   Dibuja una línea a una distancia relativa a la posición actual."
  14305. " ▀▀▀▀▀▀▀▀▀"
  14306. ""
  14307. " Sintaxis:"
  14308. "   void far linerel (int dx, int dy);"
  14309. ""
  14310. "Usa el color, estilo de línea y grosor actual."
  14311. ""
  14312. ""
  14313. " ▄▄▄▄▄▄▄▄"
  14314. " ▌lineto▐   Dibuja una línea desde la posición actual hasta (x,y)."
  14315. " ▀▀▀▀▀▀▀▀"
  14316. ""
  14317. " Sintaxis:"
  14318. "   void far lineto (int x, int y);"
  14319. ""
  14320. ""
  14321. " ▄▄▄▄▄▄▄▄▄"
  14322. " ▌moverel▐   Cambia la posición actual a una distancia relativa."
  14323. " ▀▀▀▀▀▀▀▀▀"
  14324. ""
  14325. " Sintaxis:"
  14326. "   void far moverel (int dx, int dy);"
  14327. ""
  14328. ""
  14329. " ▄▄▄▄▄▄▄▄"
  14330. " ▌moveto▐   Cambia la posición actual a (x,y)."
  14331. " ▀▀▀▀▀▀▀▀"
  14332. ""
  14333. " Sintaxis:"
  14334. "   void far moveto (int x, int y);"
  14335. ""
  14336. ""
  14337. " ▄▄▄▄▄▄▄▄▄"
  14338. " ▌outtext▐   Visualiza una cadena en el viewport (modo gráfico)."
  14339. " ▀▀▀▀▀▀▀▀▀"
  14340. ""
  14341. " Sintaxis:"
  14342. "   void far outtext (char far *cadena_de_texto);"
  14343. ""
  14344. ""
  14345. " ▄▄▄▄▄▄▄▄▄▄▄"
  14346. " ▌outtextxy▐   Visualiza una cadena en el lugar especificado (modo gráfico)."
  14347. " ▀▀▀▀▀▀▀▀▀▀▀"
  14348. ""
  14349. " Sintaxis:"
  14350. "   void far outtextxy (int x, int y, char far *cadena_de_texto);"
  14351. ""
  14352. ""
  14353. " ▄▄▄▄▄▄▄▄▄▄"
  14354. " ▌pieslice▐   Dibuja y rellena un sector de círculo."
  14355. " ▀▀▀▀▀▀▀▀▀▀"
  14356. ""
  14357. " Sintaxis:"
  14358. "   void far pieslice (int x, int y, int ang_comienzo, int ang_final,"
  14359. "                      int radio);"
  14360. ""
  14361. ""
  14362. " ▄▄▄▄▄▄▄▄▄▄"
  14363. " ▌putimage▐   Escribe una imagen en la pantalla."
  14364. " ▀▀▀▀▀▀▀▀▀▀"
  14365. ""
  14366. " Sintaxis:"
  14367. "   void far putimage (int izq, int ar, void far *bitmap, int op);"
  14368. ""
  14369. "bitmap apunta a un mapa de bits, normalmente creado por la función"
  14370. "getimage(). El valor op especifica cómo se combina la imagen con el"
  14371. "contenido actual del área en (izq,ar)."
  14372. ""
  14373. ""
  14374. " ▄▄▄▄▄▄▄▄▄▄"
  14375. " ▌putpixel▐   Escribe un pixel en el punto especificado."
  14376. " ▀▀▀▀▀▀▀▀▀▀"
  14377. ""
  14378. " Sintaxis:"
  14379. "   void far putpixel (int x, int y, int color);"
  14380. ""
  14381. ""
  14382. " ▄▄▄▄▄▄▄▄▄▄▄"
  14383. " ▌rectangle▐   Dibuja un rectángulo (modo gráfico)."
  14384. " ▀▀▀▀▀▀▀▀▀▀▀"
  14385. ""
  14386. " Sintaxis:"
  14387. "   void far rectangle (int izq, int ar, int der, int ab);"
  14388. ""
  14389. "Una el estilo, grosor y color de línea actual."
  14390. ""
  14391. ""
  14392. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14393. " ▌registerbgidriver▐   Registra controlador gráfico en el enlazado."
  14394. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  14395. ""
  14396. " Sintaxis:"
  14397. "   int registerbgidriver (void (*driver) (void));"
  14398. ""
  14399. "Informa al sistema gráfico que el controlador dispositivo apuntador por"
  14400. "driver fue incluido en tiempo de enlazado."
  14401. ""
  14402. ""
  14403. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14404. " ▌registerbgifont▐   Registra estilo de texto en el enlazado."
  14405. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  14406. ""
  14407. " Sintaxis:"
  14408. "   int registerbgifont (void (*font) (void));"
  14409. ""
  14410. "Informa al sistema gráfico que el estilo de texto apuntado por font fue"
  14411. "incluido en tiemo de enlazado."
  14412. ""
  14413. ""
  14414. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14415. " ▌restorecrtmode▐   Restaura modo de pantalla previa a entrar al modo"
  14416. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   gráfico."
  14417. ""
  14418. " Sintaxis:"
  14419. "   void far restorecrtmode (void);"
  14420. ""
  14421. ""
  14422. " ▄▄▄▄▄▄▄▄"
  14423. " ▌sector▐   Dibuja y rellena un sector elíptico."
  14424. " ▀▀▀▀▀▀▀▀"
  14425. ""
  14426. " Sintaxis:"
  14427. "   void far sector (int x, int y, int ang_comienzo, int ang_final,"
  14428. "                    int radiox, int radioy);"
  14429. ""
  14430. "x e y definen el punto central; ang_comienzo y ang_final definen los"
  14431. "ángulos de comienzo y final; radiox y radioy son los radios horizontal"
  14432. "y vertical."
  14433. ""
  14434. "El sector es dibujado con el color activo y es rellenado con el color y"
  14435. "patrón de relleno actual."
  14436. ""
  14437. ""
  14438. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14439. " ▌setactivepage▐   Pone la página activa para la salida gráfica."
  14440. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  14441. ""
  14442. " Sintaxis:"
  14443. "   void far setactivepage (int pagina);"
  14444. ""
  14445. "Las salidas gráficas siguientes a la llamada a esta función irán a la"
  14446. "página de visualización especificada. Esta página puede no ser la página"
  14447. "visual que es la que actualmente está visualizada."
  14448. ""
  14449. ""
  14450. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14451. " ▌setallpalette▐   Cambia los colores de todas las paletas."
  14452. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  14453. ""
  14454. " Sintaxis:"
  14455. "   void far setallpalette (struct palettetype far *paleta);"
  14456. ""
  14457. ""
  14458. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14459. " ▌setaspectratio▐   Pone la cuadratura gráfica"
  14460. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  14461. ""
  14462. " Sintaxis:"
  14463. "   void far setaspectratio (int cuadx, int cuady);"
  14464. ""
  14465. "cuadx debería ser 10000. Usa cuadx=10000 cuando los pixels son cuadrados"
  14466. "(VGA); <10000 para pixels altos."
  14467. ""
  14468. ""
  14469. " ▄▄▄▄▄▄▄▄▄▄▄▄"
  14470. " ▌setbkcolor▐   Pone el color de fondo actual usando la paleta."
  14471. " ▀▀▀▀▀▀▀▀▀▀▀▀"
  14472. ""
  14473. " Sintaxis:"
  14474. "   void far setbkcolor(int color);"
  14475. ""
  14476. ""
  14477. " ▄▄▄▄▄▄▄▄▄▄"
  14478. " ▌setcolor▐   Pone el color actual para dibujar."
  14479. " ▀▀▀▀▀▀▀▀▀▀"
  14480. ""
  14481. " Sintaxis:"
  14482. "   void far setcolor (int color);"
  14483. ""
  14484. ""
  14485. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14486. " ▌setfillpattern▐   Selecciona un patrón de relleno definido por el usuario."
  14487. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  14488. ""
  14489. " Sintaxis:"
  14490. "   void far setfillpattern (char far *patron_usuario, int color);"
  14491. ""
  14492. "El parámetro patron_usuario apunta a un área de 8 bytes donde se encuentra"
  14493. "el patrón de bits 8 por 8."
  14494. ""
  14495. ""
  14496. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14497. " ▌setfillstyle▐   Pone el patrón y color de relleno."
  14498. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  14499. ""
  14500. " Sintaxis:"
  14501. "   void far setfillstyle (int patron, int color);"
  14502. ""
  14503. "El parámetro patron identifica un patrón predefinido."
  14504. ""
  14505. "Para poner un patrón de relleno definido por el usuario, llamar a la"
  14506. "función setfillpattern()."
  14507. ""
  14508. ""
  14509. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14510. " ▌setgraphbufsize▐   Cambia el tamaño del buffer gráfico interno."
  14511. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  14512. ""
  14513. " Sintaxis:"
  14514. "   unsigned far setgraphbufsize (unsigned tambuf);"
  14515. ""
  14516. "Esta función debe ser llamada antes de llamar a la función initgraph()."
  14517. "Devuelve el tamaño previo del buffer interno."
  14518. ""
  14519. ""
  14520. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14521. " ▌setgraphmode▐   Pone el sistema en modo gráfico y borra la pantalla."
  14522. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  14523. ""
  14524. " Sintaxis:"
  14525. "   void far setgraphmode (int modo);"
  14526. ""
  14527. ""
  14528. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14529. " ▌setlinestyle▐   Pone el estilo de línea, anchura y patrón actual."
  14530. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  14531. ""
  14532. " Sintaxis:"
  14533. "   void far setlinestyle (int estilo_de_linea, unsigned patron_usuario,"
  14534. "                          int grosor);"
  14535. ""
  14536. "Pone el estilo y grosor para el dibujo de líneas en funciones gráficas."
  14537. ""
  14538. ""
  14539. " ▄▄▄▄▄▄▄▄▄▄▄▄"
  14540. " ▌setpalette▐   Cambia un color de la paleta."
  14541. " ▀▀▀▀▀▀▀▀▀▀▀▀"
  14542. ""
  14543. " Sintaxis:"
  14544. "   void far setpalette (int num_de_color, int color);"
  14545. ""
  14546. ""
  14547. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14548. " ▌setrgbpalette▐   Define colores para la tarjeta gráfica IBM-8514."
  14549. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  14550. ""
  14551. " Sintaxis:"
  14552. "   void far setrgbpalette (int numcolor, int rojo, int verde, int azul);"
  14553. ""
  14554. "El parámetro numcolor es la entrada de la paleta a ser cargada (número"
  14555. "entre 0 y 255). Los parámetros rojo, verde y azul definen los colores"
  14556. "componentes."
  14557. ""
  14558. "Sólo el byte menos significativo de estos valores es usado, y sólo sus 6"
  14559. "bits más significativos son cargados en la paleta."
  14560. ""
  14561. ""
  14562. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14563. " ▌settextjustify▐   Pone justificación de texto para modo gráfico."
  14564. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  14565. ""
  14566. " Sintaxis:"
  14567. "   void far settextjustify (int horiz, int vert);"
  14568. ""
  14569. "Afecta a la salida de texto con outtext(), etc. El texto es justificado"
  14570. "horizontalmente y verticalmente."
  14571. ""
  14572. "Los valores para horiz y vert son los siguientes:"
  14573. ""
  14574. "  Param   Nombre        Val   Cómo justificar"
  14575. " ═══════╪═════════════╪═════╪═══════════════════"
  14576. "  horiz │ LEFT_TEXT   │ (0) │ izquierda       <"
  14577. "        │ CENTER_TEXT │ (1) │ > centrar texto <"
  14578. "        │ RIGHT_TEXT  │ (2) │ >         derecha"
  14579. " ───────┼─────────────┼─────┼───────────────────"
  14580. "  vert  │ BOTTOM_TEXT │ (0) │ de abajo a arriba"
  14581. "        │ CENTER_TEXT │ (1) │ centrar texto"
  14582. "        │ TOP_TEXT    │ (2) │ de arriba a abajo"
  14583. ""
  14584. ""
  14585. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14586. " ▌settextstyle▐   Pone las características actuales del texto."
  14587. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  14588. ""
  14589. " Sintaxis:"
  14590. "  void far settextstyle (int estilo, int direccion, int tamanio_de_caracter);"
  14591. ""
  14592. ""
  14593. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14594. " ▌setusercharsize▐   Factor de amplificacion de los caracteres definidos"
  14595. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   por el usuario para los estilos de caracteres."
  14596. ""
  14597. " Sintaxis:"
  14598. "   void far setusercharsize (int multx, int divx, int multy, int divy);"
  14599. ""
  14600. ""
  14601. " ▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14602. " ▌setviewport▐   Pone el viewport actual para salida gráfica."
  14603. " ▀▀▀▀▀▀▀▀▀▀▀▀▀"
  14604. ""
  14605. " Sintaxis:"
  14606. "   void far setviewport(int izq, int ar, int der, int ab, int clip);"
  14607. ""
  14608. ""
  14609. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14610. " ▌setvisualpage▐   Pone el número de página gráfica visual."
  14611. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  14612. ""
  14613. " Sintaxis:"
  14614. "   void far setvisualpage (int pagina);"
  14615. ""
  14616. "Algunos adaptadores gráficos tienen más de una página de memoria. La página"
  14617. "visual es la página que está actualmente visualizada en la pantalla. Las fun-"
  14618. "ciones gráficas escriben en la página activa, definida por setactivepage()."
  14619. ""
  14620. ""
  14621. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14622. " ▌setwritemode▐   Pone el modo de escritura para el dibujo de líneas en modo"
  14623. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀   gráfico."
  14624. ""
  14625. " Sintaxis:"
  14626. "   void far setwritemode (int modo);"
  14627. ""
  14628. "Si el modo es 0, las líneas sobreescriben el contenido actual de la pantalla."
  14629. ""
  14630. "Si el modo es 1, una operación exclusive OR (XOR) es ejecutada entre los"
  14631. "pixels de la línea y los puntos correspondientes sobre la pantalla."
  14632. ""
  14633. ""
  14634. " ▄▄▄▄▄▄▄▄▄▄▄▄"
  14635. " ▌textheight▐   Devuelve la altura de una cadena en pixels."
  14636. " ▀▀▀▀▀▀▀▀▀▀▀▀"
  14637. ""
  14638. " Sintaxis:"
  14639. "   int far textheight (char far *cadena_con_texto);"
  14640. ""
  14641. "La función textwidth() es útil para ser usadas con funciones gráficas"
  14642. "tales como outtext()."
  14643. ""
  14644. ""
  14645. " ▄▄▄▄▄▄▄▄▄▄▄"
  14646. " ▌textwidth▐   Devuelve la anchura de una cadena en pixels."
  14647. " ▀▀▀▀▀▀▀▀▀▀▀"
  14648. ""
  14649. " Sintaxis:"
  14650. "   int far textwidth (char far *cadena_con_texto);"
  14651. ""
  14652. "La función textwidth() es útil para ser usadas con funciones gráficas"
  14653. "tales como outtext()."
  14654. ""
  14655. ""
  14656. "CONTANTES, TIPOS DE DATOS, Y VARIABLES GLOBALES:"
  14657. "************************************************"
  14658. ""
  14659. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14660. "  ARCCOORDSTYPE (struct)"
  14661. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  14662. ""
  14663. "Usado por la función getarccords() para obtener las coordenadas de la"
  14664. "última llamada a arc()."
  14665. ""
  14666. "  struct arccoordstype"
  14667. "    {"
  14668. "      int  x, y;               /* punto central */"
  14669. "      int  xstart, ystart;  /* posición inicial */"
  14670. "      int  xend, yend;        /* posición final */"
  14671. "    };"
  14672. ""
  14673. ""
  14674. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14675. "  EGA_xxxx (#defines)"
  14676. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  14677. ""
  14678. "Colores para las funciones setpalette() y setallpalette()."
  14679. ""
  14680. "  EGA_BLACK        EGA_DARKGRAY"
  14681. "  EGA_BLUE         EGA_LIGHTBLUE"
  14682. "  EGA_GREEN        EGA_LIGHTGREEN"
  14683. "  EGA_CYAN         EGA_LIGHTCYAN"
  14684. "  EGA_RED          EGA_LIGHTRED"
  14685. "  EGA_MAGENTA      EGA_LIGHTMAGENTA"
  14686. "  EGA_BROWN        EGA_YELLOW"
  14687. "  EGA_LIGHTGRAY    EGA_WHITE"
  14688. ""
  14689. ""
  14690. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14691. "  fill_patterns (enum)"
  14692. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  14693. ""
  14694. "Patrones de relleno para las funciones getfillsettings() y setfillstyle()."
  14695. ""
  14696. "  EMPTY_FILL        Usa color de fondo"
  14697. "  SOLID_FILL        Usa color de relleno sólido"
  14698. "  LINE_FILL         Relleno con ---"
  14699. "  LTSLASH_FILL      Relleno con ///"
  14700. "  SLASH_FILL        Relleno con líneas gruesas ///"
  14701. "  BKSLASH_FILL      Relleno con líneas gruesas \\\"
  14702. "  LTBKSLASH_FILL    Relleno con \\\"
  14703. "  HATCH_FILL        Sombreado claro"
  14704. "  XHATCH_FILL       Sombreado espeso"
  14705. "  INTERLEAVE_FILL   Lineas entrelazadas"
  14706. "  WIDE_DOT_FILL     Puntos bastante espaciados"
  14707. "  CLOSE_DOT_FILL    Puntos poco espaciados"
  14708. "  USER_FILL         Relleno definido por el usuario"
  14709. ""
  14710. ""
  14711. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14712. "  FILLSETTINGSTYPE (struct)"
  14713. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  14714. ""
  14715. "Usado para obtener los valores de relleno actuales por la función"
  14716. "getfillsettings()."
  14717. ""
  14718. "  struct fillsettingstype"
  14719. "    {"
  14720. "      int  pattern;"
  14721. "      int  color;"
  14722. "    };"
  14723. ""
  14724. ""
  14725. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14726. "  font_names (enum)"
  14727. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  14728. ""
  14729. "Nombres de tipos de caracteres gráficos"
  14730. ""
  14731. "  DEFAULT_FONT"
  14732. "  TRIPLEX_FONT"
  14733. "  SMALL_FONT"
  14734. "  SANS_SERIF_FONT"
  14735. "  GOTHIC_FONT"
  14736. ""
  14737. ""
  14738. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14739. "  graphics_drivers (enum)"
  14740. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  14741. ""
  14742. "Controladores gráficos BGI."
  14743. ""
  14744. "  CGA           MCGA"
  14745. "  EGA           EGA64"
  14746. "  EGAMONO       IBM8514"
  14747. "  HERCMONO      ATT400"
  14748. "  VGA           PC3270"
  14749. "  DETECT (Requiere autodetección)"
  14750. ""
  14751. ""
  14752. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14753. "  graphics_errors (enum)"
  14754. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  14755. ""
  14756. "Códigos de error devuelto por graphresult()."
  14757. ""
  14758. "  grOk                grNoInitGraph"
  14759. "  grNotDetected       grFileNotFound"
  14760. "  grInvalidDriver     grNoLoadMem"
  14761. "  grNoScanMem         grNoFloodMem"
  14762. "  grFontNotFound      grNoFontMem"
  14763. "  grInvalidMode       grError"
  14764. "  grIOerror           grInvalidFont"
  14765. "  grInvalidFontNum    grInvalidDeviceNum"
  14766. "  grInvalidVersion"
  14767. ""
  14768. ""
  14769. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14770. "  graphics_modes (enum)"
  14771. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  14772. ""
  14773. "Modos gráficos para cada controlador BGI"
  14774. " ════════════╤═════════════╤══════════════"
  14775. "  CGAC0      │  320 x 200  │  paleta 0"
  14776. "  CGAC1      │  320 x 200  │  paleta 1"
  14777. "  CGAC2      │  320 x 200  │  paleta 2"
  14778. "  CGAC3      │  320 x 200  │  paleta 3"
  14779. "  CGAHI      │  640 x 200  │  2 colores"
  14780. "             │             │"
  14781. "  MCGAC0     │  320 x 200  │  paleta 0"
  14782. "  MCGAC1     │  320 x 200  │  paleta 1"
  14783. "  MCGAC2     │  320 x 200  │  paleta 2"
  14784. "  MCGAC3     │  320 x 200  │  paleta 3"
  14785. "  MCGAMED    │  640 x 200  │  2 colores"
  14786. "  MCGAHI     │  640 x 480  │  2 colores"
  14787. "             │             │"
  14788. "  EGALO      │  640 x 200  │ 16 colores"
  14789. "  EGAHI      │  640 x 350  │ 16 colores"
  14790. "  EGA64LO    │  640 x 200  │ 16 colores"
  14791. "  EGA64HI    │  640 x 350  │  4 colores"
  14792. "             │             │"
  14793. "  EGAMONOHI  │  640 x 350  │  2 colores"
  14794. "  HERCMONOHI │  720 x 348  │  2 colores"
  14795. "             │             │"
  14796. "  ATT400C0   │  320 x 200  │  paleta 0"
  14797. "  ATT400C1   │  320 x 200  │  paleta 1"
  14798. "  ATT400C2   │  320 x 200  │  paleta 2"
  14799. "  ATT400C3   │  320 x 200  │  paleta 3"
  14800. "  ATT400MED  │  640 x 200  │  2 colores"
  14801. "  ATT400HI   │  640 x 400  │  2 colores"
  14802. "             │             │"
  14803. "  VGALO      │  640 x 200  │ 16 colores"
  14804. "  VGAMED     │  640 x 350  │ 16 colores"
  14805. "  VGAHI      │  640 x 480  │ 16 colores"
  14806. "             │             │"
  14807. "  PC3270HI   │  720 x 350  │  2 colores"
  14808. "  IBM8514LO  │  640 x 480  │256 colores"
  14809. "  IBM8514HI  │ 1024 x 768  │256 colores"
  14810. ""
  14811. ""
  14812. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14813. "  line_styles (enum)"
  14814. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  14815. ""
  14816. "Estilos de línea para las funciones getlinesettings() y setlinestyle()."
  14817. ""
  14818. "  SOLID_LINE"
  14819. "  DOTTED_LINE"
  14820. "  CENTER_LINE"
  14821. "  DASHED_LINE"
  14822. "  USERBIT_LINE  estilo de línea definido por el usuario"
  14823. ""
  14824. ""
  14825. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14826. "  line_widths (enum)"
  14827. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  14828. ""
  14829. "Anchuras de línea para las funciones getlinesettings() y setlinestyle()."
  14830. ""
  14831. "  NORM_WIDTH"
  14832. "  THICK_WIDTH"
  14833. ""
  14834. ""
  14835. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14836. "  MAXCOLORS (#define)"
  14837. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  14838. ""
  14839. "Define el número máximo de entradas de colores para el campo array de"
  14840. "colores en la estructura palettetype."
  14841. ""
  14842. ""
  14843. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14844. "  PALETTETYPE (struct)"
  14845. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  14846. ""
  14847. "Contiene información de la paleta para el controlador gráfico actual."
  14848. "Esta estructura es usada por las funciones getpalette(), setpalette()"
  14849. "y setallpalette()."
  14850. ""
  14851. "  struct palettetype"
  14852. "    {"
  14853. "      unsigned char  size;"
  14854. "      signed   char  colors[MAXCOLORS+1];"
  14855. "    };"
  14856. ""
  14857. ""
  14858. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14859. "  POINTTYPE (struct)"
  14860. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  14861. ""
  14862. "Coordenadas de un punto."
  14863. ""
  14864. "  struct pointtype"
  14865. "    {"
  14866. "      int  x ;"
  14867. "      int  y ;"
  14868. "    };"
  14869. ""
  14870. ""
  14871. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14872. "  putimage_ops (enum)"
  14873. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  14874. ""
  14875. "Operadores para putimage()."
  14876. ""
  14877. "  COPY_PUT   Copia"
  14878. "  XOR_PUT    Exclusive OR"
  14879. "  OR_PUT     Inclusive OR"
  14880. "  AND_PUT    AND"
  14881. "  NOT_PUT    Copia inversa de fuente"
  14882. ""
  14883. ""
  14884. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14885. "  text_just (enum)"
  14886. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  14887. ""
  14888. "Justificación horizontal y vertical para la función settextjustify()."
  14889. ""
  14890. "  LEFT_TEXT"
  14891. "  CENTER_TEXT"
  14892. "  RIGHT_TEXT"
  14893. "  BOTTOM_TEXT"
  14894. "  TOP_TEXT"
  14895. ""
  14896. ""
  14897. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14898. "  *_DIR (Dirección) (#defines)"
  14899. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  14900. ""
  14901. "Dirección de salida gráfica."
  14902. ""
  14903. "  HORIZ_DIR   De izquierda a derecha"
  14904. "  VERT_DIR    De abajo hacia arriba"
  14905. ""
  14906. ""
  14907. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14908. "  TEXTSETTINGSTYPE (struct)"
  14909. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  14910. ""
  14911. "Usado para obtener los valores de texto actual por la función"
  14912. "gettextsettings()."
  14913. ""
  14914. "  struct textsettingstype"
  14915. "    {"
  14916. "      int  font;"
  14917. "      int  direction;"
  14918. "      int  charsize;"
  14919. "      int  horiz;"
  14920. "      int  vert;"
  14921. "    };"
  14922. ""
  14923. ""
  14924. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14925. "  USER_CHAR_SIZE (#define)"
  14926. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  14927. ""
  14928. "Tamaño de los caracteres definidos por el usuario (tamaño de caracteres ="
  14929. "amplificación de caracteres en salida gráfica)."
  14930. ""
  14931. "Valores que puede tomar esta constante simbólica:"
  14932. ""
  14933. " ■ 1   visualiza caracteres en caja de 8-por-8 en la pantalla"
  14934. " ■ 2   visualiza caracteres en caja de 16-por-16 en la pantalla"
  14935. "   ..."
  14936. " ■ 10  visualiza caracteres en caja de 80-por-80 en la pantalla"
  14937. ""
  14938. ""
  14939. ""
  14940. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  14941. "  VIEWPORTTYPE (struct)"
  14942. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  14943. ""
  14944. "Estructura usada para obtener información sobre el viewport corriente"
  14945. "por la función getviewsettings()."
  14946. ""
  14947. "  struct viewporttype"
  14948. "    {"
  14949. "      int  left;"
  14950. "      int  top;"
  14951. "      int  right;"
  14952. "      int  bottom;"
  14953. "      int  clip;"
  14954. "    };"
  14955. ""
  14956. ""
  14957. "NOTA: En el ejemplo 4 de esta lección se muestra cómo se pueden utilizar"
  14958. "la mayoría de estas funciones."
  14959. ""
  14960. endvis
  14961. endt
  14962. end lección 10
  14963.  
  14964. ; LECCION 11
  14965. begin
  14966. beginv
  14967. borde 2
  14968. color 1 7
  14969. centrar_coordenadas
  14970. cabecera " INDICE DE LA LECCION 11 "
  14971. ""
  14972. "- Primera parte:"
  14973. ""
  14974. "  · Saltos no locales (~setjmp.h~)."
  14975. "  · Envío y recepción de señales (~signal.h~)."
  14976. "  · Asignación dinámica (~alloc.h~ en Turbo C)."
  14977. begint
  14978. "  · Funciones de proceso (~process.h~)."
  14979. ""
  14980. "- Segunda parte:"
  14981. ""
  14982. "  · Funciones de directorio (~dir.h~)."
  14983. "  · Funciones del DOS (~interrupt~ y ~dos.h~)."
  14984. "  · Funciones de la ROM BIOS (~bios.h~)."
  14985. endt
  14986. ""
  14987. endv
  14988. borrar_pantalla
  14989. beginv
  14990. cabecera " SALTOS NO LOCALES "
  14991. color 15 3
  14992. centrar_coordenadas
  14993. borde 2
  14994. ""
  14995. "  En el fichero de cabecera ~<setjmp.h>~"
  14996. "  tenemos la información necesaria para"
  14997. "  poder realizar saltos no locales, es"
  14998. "  decir, saltos de una función a otra."
  14999. ""
  15000. "  Recordad que la instrucción goto del"
  15001. "  C sólo puede realizar un salto dentro  "
  15002. "  de una función."
  15003. ""
  15004. endv
  15005. borrar_pantalla
  15006. beginvis
  15007. no_multiatributo
  15008. cabecera " FICHERO DE CABECERA SETJMP.H "
  15009. coordenadas_completas 1 2 80 24
  15010. color 0 3
  15011. borde 2
  15012. ""
  15013. "En esta biblioteca sólo hay dos funciones: longjmp() y setjmp()."
  15014. ""
  15015. "▄▄▄▄▄▄▄▄▄"
  15016. "▌longjmp▐   Ejecuta goto (salto) no local."
  15017. "▀▀▀▀▀▀▀▀▀"
  15018. ""
  15019. "Sintaxis:"
  15020. "  void longjmp (jmp_buf jmpb, int valdev);"
  15021. ""
  15022. "La instrucción longjmp() da lugar a que la ejecución del programa se"
  15023. "retome en el punto en que se llamó por última vez a setjmp(). Estas dos"
  15024. "funciones son la forma en que C permite saltar entre funciones. Tenga"
  15025. "en cuenta que se necesita la cabecera setjmp.h."
  15026. ""
  15027. "La función longjmp() opera inicializando la pila ya descrita por jmpb,"
  15028. "que debe haber sido activada en una llamada anterior a setjmp(). Esto"
  15029. "da lugar a que la ejecución del programa se retome en la sentencia"
  15030. "siguiente al setjmp() que la llamó. En otras palabras, la computadora"
  15031. "es «engañada» haciéndole pensar que nunca dejó la función que llamó"
  15032. "a setjmp()."
  15033. ""
  15034. "El buffer jmpb es de tipo jmp_buf, que está definido en la cabecera"
  15035. "setjmp.h. El buffer debe haber sido activado a través de una llamada"
  15036. "a setjmp(), anterior a la llamada a longjmp()."
  15037. ""
  15038. "El valor de valdev se transforma en el valor de vuelta de setjmp() y"
  15039. "puede preguntarse por él para determinar de dónde viene longjmp(). El"
  15040. "único valor no permitido es 0, puesto que setjmp() devuelve este valor"
  15041. "cuando se le llama por primera vez."
  15042. ""
  15043. "Es importante comprender que longjmp() se debe llamar antes de que la"
  15044. "función que llamó a setjmp() vuelva. Si no, el resultado queda indefi-"
  15045. "nido. (Realmente, la mayor parte de las veces el programa aborta.)"
  15046. ""
  15047. ""
  15048. "▄▄▄▄▄▄▄▄"
  15049. "▌setjmp▐   Almacena información de contexto para poder realizar saltos no"
  15050. "▀▀▀▀▀▀▀▀   locales."
  15051. ""
  15052. "Sintaxis:"
  15053. "  int setjmp (jmp_buf jmpb);"
  15054. ""
  15055. "La función setjmp() guarda el contenido de la pila del sistema en el"
  15056. "buffer jmpb para ser utilizado más tarde por longjmp()."
  15057. ""
  15058. "La función setjmp() devuelve 0 después de la llamada. Sin embargo,"
  15059. "longjmp() pasa un argumento a setjmp() cuando se ejecuta, y es este"
  15060. "valor (que siempre es disntino de cero) el valor de setjmp() después"
  15061. "de la llamada a longjmp()."
  15062. ""
  15063. ""
  15064. "A continuación se presenta la estructura del buffer para estas dos funciones"
  15065. "en Turbo C, si utilizas otro compilador puedes ver cómo es en el tuyo visua-"
  15066. "lizando el fichero setjmp.h. De todas formas no es de mucha utilidad saber"
  15067. "cuál es el contenido de esta estructura."
  15068. ""
  15069. "▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  15070. " jmp_buf (tipo)"
  15071. "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  15072. ""
  15073. "Un buffer de tipo jmp_buf es usado para salvar y restaurar el estado de un"
  15074. "programa en un determinado momento."
  15075. ""
  15076. "  typedef struct"
  15077. "    {"
  15078. "      unsigned  j_sp,   j_ss,"
  15079. "      unsigned  j_flag, j_cs;"
  15080. "      unsigned  j_ip,   j_bp;"
  15081. "      unsigned  j_di,   j_es;"
  15082. "      unsigned  j_si,   j_ds;"
  15083. "    } jmp_buf[1];"
  15084. ""
  15085. ""
  15086. ""
  15087. "Veamos un ejemplo bastante ilustrativo de cómo poder realizar un salto no"
  15088. "local. Este ejemplo corresponde al primer ejemplo de esta lección, de este"
  15089. "modo lo puedes ejecutar."
  15090. ""
  15091. "  /*"
  15092. "    Este programa imprime «1 2 3»"
  15093. "  */"
  15094. ""
  15095. "  #include <stdio.h>"
  15096. "  #include <setjmp.h>"
  15097. "  #include <stdlib.h>"
  15098. ""
  15099. "  void func (jmp_buf);"
  15100. ""
  15101. "  void main (void)"
  15102. "  {"
  15103. "    int valor;"
  15104. "    jmp_buf jmpb;"
  15105. ""
  15106. "    printf ("1 ");"
  15107. "    valor = setjmp (jmpb);"
  15108. "    if (valor != 0)"
  15109. "      {"
  15110. "        printf ("3 ");"
  15111. "        exit (valor);"
  15112. "      }"
  15113. "    printf ("2 ");"
  15114. "    func (jmpb);"
  15115. "    printf ("4 ");"
  15116. "  }"
  15117. ""
  15118. "  void func (jmp_buf jmpb)"
  15119. "  {"
  15120. "    longjmp (jmpb, 1);"
  15121. "  }"
  15122. ""
  15123. endvis
  15124. beginv
  15125. cabecera " ENVIO Y RECEPCION DE SEÑALES "
  15126. color 15 3
  15127. centrar_coordenadas
  15128. ""
  15129. "  En el fichero de cabecera ~<signal.h>~ "
  15130. "  hay declaradas dos funciones junto"
  15131. "  con algunas macros para poder enviar"
  15132. "  y recibir señales (interrupciones)"
  15133. "  en un programa en ejecución."
  15134. ""
  15135. endv
  15136. borrar_pantalla
  15137. beginvis
  15138. no_multiatributo
  15139. cabecera " FICHERO DE CABECERA SIGNAL.H "
  15140. coordenadas_completas 1 2 80 24
  15141. color 0 3
  15142. borde 2
  15143. ""
  15144. "Este fichero sólo declara dos funciones: raise() y signal(). Al ser estas"
  15145. "dos funciones dependientes del sistema, el ANSI C no da una sintaxis general"
  15146. "para estas funciones, sino que nos dice que la función raise() envía una"
  15147. "señal a un programa en ejecución y la función signal() define la función que"
  15148. "se ejecutará en un programa cuando éste reciba una determinada señal; el "
  15149. "ANSI C también define las macros: SIGABRT, SIGFPE, SIGILL, SIGINT, SIGSEGV,"
  15150. "SIGTERM, SIG_DFL y SEIG_IGN, todas ellas declaradas, junto con las funciones"
  15151. "raise() y signal(), en el fichero de cabecera signal.h. Una descripción"
  15152. "completa de todas estas macros y funciones se realizará en las siguientes"
  15153. "líneas para aquellos usuarios que tengan la opción de turbo a on."
  15154. ""
  15155. begint
  15156. ""
  15157. " ▄▄▄▄▄▄▄"
  15158. " ▌raise▐   Envía una señal software."
  15159. " ▀▀▀▀▀▀▀"
  15160. ""
  15161. " Sintaxis:"
  15162. "   int raise (int sig);"
  15163. ""
  15164. "Un programa se puede enviar señales a sí mismo usando raise(). Esta función"
  15165. "ejecuta el manejador instalado por signal() para ese tipo de señal (o el"
  15166. "manejador por defecto)."
  15167. ""
  15168. "Devuelve 0 si tiene éxito y un valor distinto de 0 en caso contrario."
  15169. ""
  15170. ""
  15171. " ▄▄▄▄▄▄▄▄"
  15172. " ▌signal▐   Especifica las acciones a realizar asociadas a una señal."
  15173. " ▀▀▀▀▀▀▀▀"
  15174. ""
  15175. " Sintaxis:"
  15176. "   void (* signal (int sig, void (*func) (int sig [,int subcode]))) (int);"
  15177. ""
  15178. "La función a la cual apunta func será llamada cuando una señal de tipo sig"
  15179. "sea enviada."
  15180. ""
  15181. "Las señales son enviadas cuando ocurre una condición de excepción o cuando"
  15182. "es llamada la función raise()."
  15183. ""
  15184. "El prototipo de esta función en el fichero signal.h es:"
  15185. ""
  15186. "   void (* signal (int sig, void (*func) (/* int */))) (int);"
  15187. ""
  15188. "lo que quiere decir que los parámetros de func están indefinidos pero que"
  15189. "normalmente suele ser un int."
  15190. ""
  15191. ""
  15192. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  15193. "  SIG_xxx (#defines)"
  15194. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  15195. ""
  15196. "Las funciones predefinidas para manejar las señales generados por la función"
  15197. "raise() o por sucesos externos son:"
  15198. ""
  15199. "  SIG_DFL   Terminar el programa."
  15200. "  SIG_IGN   Ninguna acción, ignorar señal."
  15201. "  SIG_ERR   Devuelve código de error."
  15202. ""
  15203. ""
  15204. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  15205. "  SIGxxxx (#defines)"
  15206. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  15207. ""
  15208. "Los tipos de señales usados por las funciones raise() y signal() son:"
  15209. ""
  15210. "  SIGABRT   Abortar"
  15211. "  SIGFPE    Trampa de punto flotante"
  15212. "  SIGILL    Instrucción ilegal"
  15213. "  SIGINT    Interrupción"
  15214. "  SIGSEGV   Violación de acceso a memoria"
  15215. "  SIGTERM   Terminar"
  15216. ""
  15217. ""
  15218. "Veamos a continuación tres ejemplos sobre las funciones y macros del"
  15219. "fichero de cabecera signal.h."
  15220. ""
  15221. "Ejemplo 1:"
  15222. ""
  15223. "  /* Este programa imprime «Divide error» */"
  15224. ""
  15225. "  #include <stdio.h>"
  15226. "  #include <signal.h>"
  15227. ""
  15228. "  void main (void)"
  15229. "  {"
  15230. "    int x, y;"
  15231. ""
  15232. "    x = 1; y = 0;"
  15233. "    printf ("x/y: %d", x / y);"
  15234. "  }"
  15235. ""
  15236. "Ejemplo 2:"
  15237. ""
  15238. "  /* Este programa imprime «Error de punto flotante.» */"
  15239. ""
  15240. "  #include <stdio.h>"
  15241. "  #include <signal.h>"
  15242. ""
  15243. "  void manejador (void)"
  15244. "  {"
  15245. "    printf ("Error de punto flotante.\n");"
  15246. "  }"
  15247. ""
  15248. "  void main (void)"
  15249. "  {"
  15250. "    int x, y;"
  15251. ""
  15252. "    signal (SIGFPE, manejador);"
  15253. ""
  15254. "    x = 1; y = 0;"
  15255. "    printf ("x/y: %d", x / y);"
  15256. "  }"
  15257. ""
  15258. "Ejemplo 3:"
  15259. ""
  15260. "  /* Este programa imprime «Error de punto flotante.» */"
  15261. ""
  15262. "  #include <stdio.h>"
  15263. "  #include <signal.h>"
  15264. ""
  15265. "  void manejador (void)"
  15266. "  {"
  15267. "    printf ("Error de punto flotante.\n");"
  15268. "  }"
  15269. ""
  15270. "  void main (void)"
  15271. "  {"
  15272. "    signal (SIGFPE, manejador);"
  15273. ""
  15274. "    raise (SIGFPE);"
  15275. "  }"
  15276. ""
  15277. endt
  15278. endvis
  15279. beginv
  15280. cabecera " ASIGNACION DINAMICA "
  15281. color 15 3
  15282. centrar_coordenadas_x 2
  15283. no_sombra
  15284. "Hay dos modos fundamentales por los que un programa en C puede guardar"
  15285. "información en la memoria central de la computadora. El primero utili-"
  15286. "zando variables globales y locales (incluyendo arrays y estructuras). El"
  15287. "segundo modo por el que se puede guardar información es mediante el sis-"
  15288. "tema de asignación dinámica de C. Por este método se asigna de la memo-"
  15289. "ria libre tanto espacio como se necesite. La zona de memoria libre se"
  15290. "encuentra entre el área de almacenamiento permanente del programa y la"
  15291. "pila. (Para la familia de procesadores 8088, el montón se supone que"
  15292. "está en el segmento de datos por defecto.)"
  15293. endv
  15294. beginv
  15295. centrar_coordenadas_x 3
  15296. color 1 3
  15297. no_sombra
  15298. "   Sistema de memoria             La pila crece hacia abajo a medida"
  15299. " ┌──────────────────────┐ Alta    que se utiliza, de modo que la can-"
  15300. " │        Pila          │         tidad de memoria necesaria está de-"
  15301. " │                     │         terminada por cómo está diseñado el"
  15302. " ├──────────────────────┤         programa. Por ejemplo, un programa"
  15303. " │                      │         con muchas funciones recursivas hace"
  15304. " │                     │         un mayor uso de la pila que uno que"
  15305. " │    Memoria libre     │         no tiene funciones recursivas ya que"
  15306. " │        para          │         las variables locales se guardan en"
  15307. " │     asignación       │         ella. La memoria necesaria para el"
  15308. " │                      │         programa y los datos globales se fija "
  15309. " ├──────────────────────┤         durante la ejecución del programa."
  15310. " │  Variables globales  │         Para satisfacer una petición de memo-"
  15311. " ├──────────────────────┤         ria, ésta se toma del área de memoria"
  15312. " │                      │         libre, que comienza justo después de"
  15313. " │      Programa        │         las variables globales y crece en di-"
  15314. " │                      │         rección hacia la pila. Como se puede"
  15315. " │                      │         adivinar, es posible, que, bajo cier-"
  15316. " │                      │         tos casos extremos, la pila pueda"
  15317. " └──────────────────────┘ Baja    invadir el montón."
  15318. endv
  15319. beginv
  15320. centrar_coordenadas_x 4
  15321. no_sombra
  15322. color 4 3
  15323. ""
  15324. "El núcleo del sistema de asignacion dinámica son las funciones malloc()"
  15325. "y free() que se encuentran en la biblioteca estándar de C. Cada vez que"
  15326. "se hace una petición de memoria mediante malloc(), se asigna una porción"
  15327. "del resto de la memoria libre. Cada vez que se hace una llamada para"
  15328. "liberar memoria mediante free(), la memoria se devuelve al sistema. La"
  15329. "forma más común para implementar malloc() y free() es organizar la me-"
  15330. "moria libre en una lista enlazada. Sin embargo, el estándar ANSI pro-"
  15331. "puesto afirma que el método de gestión de memoria depende de la imple-"
  15332. "mentación."
  15333. ""
  15334. "El estándar ANSI propuesto especifica que la información de cabecera ne-"
  15335. "cesaria para el sistema de asignación dinámica se encuentra en stdlib.h"
  15336. "y sólo define cuatro funciones para el sistema de asignación dinámica:"
  15337. "calloc(), malloc(), free() y realloc(). Sin embargo, los compiladores"
  15338. "suelen suministrar más funciones bien en el fichero de cabecera malloc.h"
  15339. "o bien en el fichero alloc.h, dependiendo del compilador."
  15340. ""
  15341. endv
  15342. beginv
  15343. centrar_coordenadas_x 6
  15344. no_sombra
  15345. color 6 3
  15346. ""
  15347. "Las funciones añadidas al ANSI C son necesarias para soportar eficiente-"
  15348. "mente la arquitectura segmentada de la familia de procesadores 8088. Es-"
  15349. "tas funciones no son válidas para compiladores diseñados para otros pro-"
  15350. "cesadores como el 68000. Debido a la segmentación de memoria que presen-"
  15351. "ta la familia de procesadores 8088, se incorporan dos nuevos modificado-"
  15352. "res de tipo no estándares que generalmente son soportados por compilado-"
  15353. "res construidos para estos procesadores. Son near y far, que se utilizan"
  15354. "normalmente para crear punteros de otro tipo que el normalmente utiliza-"
  15355. "do por el modelo de memoria del compilador. La arquitectura de la fami-"
  15356. "lia de procesadores 8088 permite el acceso directo a 1 megabyte de RAM"
  15357. "(o más con el 80386 o 80486), pero necesita utilizar un segmento y una"
  15358. "dirección de desplazamiento."
  15359. ""
  15360. endv
  15361. beginv
  15362. centrar_coordenadas_x 3
  15363. no_sombra
  15364. color 14 3
  15365. "Esencialmente, es posible organizar la memoria de una computadora basada"
  15366. "en el 8088 en uno de estos cuatro modelos (se presentan en orden cre-"
  15367. "ciente de tiempo de ejecución):"
  15368. ""
  15369. "Pequeño:  Todo el código debe ajustarse a un segmento de 64K y todos los"
  15370. "          datos deben ajustarse a un segundo segmento de 64K. Todos los"
  15371. "          punteros son de 16 bits. Este modelo da lugar a la ejecución"
  15372. "          más rápida del programa."
  15373. "Medio:    Todos los datos deben contenerse en un segmento de 64K, pero"
  15374. "          el código puede utilizar varios segmentos. Todos los punteros"
  15375. "          a datos son de 16 bits. Este modelo permite un rápido acceso"
  15376. "          a los datos, pero una ejecución del código lenta."
  15377. "Compacto: Todo el código debe ajustarse a un segmento de 64K, pero los"
  15378. "          datos pueden utilizar varios segmentos. Todos los punteros a"
  15379. "          datos son de 32 bits. La organización compacta de la memoria"
  15380. "          supone un acceso lento a los datos, pero una ejecución de"
  15381. "          código rápida."
  15382. "Grande:   Código y datos utilizan varios segmentos. Todos los punteros"
  15383. "          son de 32 bits. Este modelo da lugar a la ejecución más lenta"
  15384. "          del programa."
  15385. endv
  15386. beginv
  15387. centrar_coordenadas_x 3
  15388. no_sombra
  15389. color 5 3
  15390. ""
  15391. "   Como puedes imaginar, el acceso a memoria utilizando punteros"
  15392. "   de 16 bits es mucho más rápido que utilizando punteros de 32"
  15393. "   bits. Sin embargo, los punteros de 32 bits son necesarios"
  15394. "   cuando el código, los datos, o ambos superan la barrera de"
  15395. "   los 64K. Una forma de evitar el uso de los punteros de 32 bits"
  15396. "   es permitir la creación de punteros de 16 ó 32 bits explícita-"
  15397. "   mente por parte del programa, pasando por alto así el valor"
  15398. "   implícito. Típicamente, esto ocurre cuando un programa nece-"
  15399. "   sita gran cantidad de datos para una determinada operación."
  15400. "   En este caso se crea un puntero far, y la memoria se asigna"
  15401. "   utilizando la versión no estándar de malloc() que asigna me-"
  15402. "   moria fuera del segmento de datos por defecto. De esta forma"
  15403. "   todos los demás accesos a memoria son rápidos, y el tiempo de"
  15404. "   ejecución no se incrementa tanto como si se hubiera utilizado"
  15405. "   un modelo grande. A la inversa también puede ocurrir. Un pro-"
  15406. "   grama que utilice un modelo grande puede fijar un puntero near   "
  15407. "   a un fragmento de memoria frecuentemente accedido para incre-"
  15408. "   mentar el rendimiento."
  15409. ""
  15410. endv
  15411. begint
  15412. beginv
  15413. centrar_coordenadas_x 4
  15414. no_sombra
  15415. color 8 3
  15416. ""
  15417. " En la siguiente ventana estudiaremos todas las funciones que están"
  15418. " declaradas en el fichero de cabecera ~<alloc.h>~ que se encuentra en"
  15419. " Turbo C."
  15420. ""
  15421. " Las funciones de asignación dinámica que define el ANSI C y que en el"
  15422. " estándar están declaradas en el fichero de cabecera ~<stdlib.h>~, en el"
  15423. " caso de Turbo C, están declaradas también en el fichero alloc.h. Estas "
  15424. " funciones son: ~calloc()~, ~malloc()~, ~free()~ y ~realloc()~."
  15425. ""
  15426. endv
  15427. endt
  15428. borrar_pantalla
  15429. begint
  15430. beginvis
  15431. no_multiatributo
  15432. cabecera " FICHERO DE CABECERA ALLOC.H (TC) "
  15433. coordenadas_completas 1 2 80 24
  15434. color 0 3
  15435. borde 2
  15436. ""
  15437. " ▄▄▄▄▄"
  15438. " ▌brk▐   Cambia la asignación de espacio del segmento de datos."
  15439. " ▀▀▀▀▀"
  15440. ""
  15441. " Sintaxis:"
  15442. "   int brk (void *addr);"
  15443. ""
  15444. "Pone el tope del segmento de datos del programa en la localización de"
  15445. "memoria apuntada por addr. Si la operación tiene éxito, brk() devuelve"
  15446. "el valor de 0. Si ocurre un fallo, devuelve el valor de -1 y da valor"
  15447. "a errno."
  15448. ""
  15449. "Ejemplo:"
  15450. ""
  15451. "  /*"
  15452. "    Este programa imprime (en mi sistema):"
  15453. "    «"
  15454. "    Cambiando asignación con brk()."
  15455. "    Antes de la llamada a brk(): 63488 bytes libres."
  15456. "    Después de la llamada a brk(): 62496 bytes libres."
  15457. "    »"
  15458. "  */"
  15459. ""
  15460. "  #include <stdio.h>"
  15461. "  #include <alloc.h>"
  15462. ""
  15463. "  void main (void)"
  15464. "  {"
  15465. "    char *ptr;"
  15466. ""
  15467. "    printf ("Cambiando asignación con brk().\n");"
  15468. "    ptr = malloc (1);"
  15469. "    printf ("Antes de la llamada a brk(): %lu bytes libres.\n","
  15470. "            (long unsigned) coreleft());"
  15471. "    brk (ptr+1000);"
  15472. "    printf ("Después de la llamada a brk(): %lu bytes libres.\n","
  15473. "            (long unsigned) coreleft());"
  15474. "  }"
  15475. ""
  15476. ""
  15477. " ▄▄▄▄▄▄▄▄"
  15478. " ▌calloc▐   Asigna memoria principal."
  15479. " ▀▀▀▀▀▀▀▀"
  15480. ""
  15481. " Sintaxis:"
  15482. "   void *calloc (size_t nelems, size_t tam);"
  15483. ""
  15484. "El prototipo de esta función también se encuentra en el fichero stdlib.h."
  15485. ""
  15486. "Asigna espacio para nelems elementos de tam bytes cada uno y almacena cero"
  15487. "en el área."
  15488. ""
  15489. "Devuelve un puntero al nuevo bloque asignado o NULL si no existe bastante"
  15490. "espacio."
  15491. ""
  15492. ""
  15493. " ▄▄▄▄▄▄▄▄▄▄"
  15494. " ▌coreleft▐   Devuelve la cantidad de memoria no usada."
  15495. " ▀▀▀▀▀▀▀▀▀▀"
  15496. ""
  15497. " Sintaxis:"
  15498. "   Modelos tiny, small, y medium:"
  15499. "     unsigned coreleft (void);"
  15500. ""
  15501. "   Modelos compact, large, y huge:"
  15502. "     unsigned long coreleft (void);"
  15503. ""
  15504. "El lector de este texto quizás se pregunte cómo puede declararse la"
  15505. "misma función coreleft() con dos tipos diferentes. Esto es muy fácil"
  15506. "hacerlo utilizando las directivas de compilación condicional:"
  15507. ""
  15508. "  #if defined(__COMPACT__) || defined(__LARGE__) || defined(__HUGE__)"
  15509. "    unsigned long coreleft (void);"
  15510. "  #else"
  15511. "    unsigned coreleft (void);"
  15512. "  #endif"
  15513. ""
  15514. "Ejemplo:"
  15515. ""
  15516. "  /*"
  15517. "    Este programa imprime (en mi sistema):"
  15518. "    «"
  15519. "    La diferencia entre el bloque asignado más alto"
  15520. "    y la cima del montón es: 63552 bytes."
  15521. "    »"
  15522. "  */"
  15523. ""
  15524. "  #include <stdio.h>"
  15525. "  #include <alloc.h>"
  15526. ""
  15527. "  void main (void)"
  15528. "  {"
  15529. "     printf ("La diferencia entre el bloque asignado más alto\n""
  15530. "             "y la cima del montón es: %lu bytes.\n","
  15531. "             (unsigned long) coreleft());"
  15532. "  }"
  15533. ""
  15534. ""
  15535. " ▄▄▄▄▄▄▄▄▄▄▄"
  15536. " ▌farcalloc▐   Asigna memoria del montón far."
  15537. " ▀▀▀▀▀▀▀▀▀▀▀"
  15538. ""
  15539. " Sintaxis:"
  15540. "   void far *farcalloc (unsigned long nunids, unsigned long tamunid);"
  15541. ""
  15542. "Asigna espacio para nunids elementos de tamunid cada uno. Devuelve un"
  15543. "puntero al nuevo bloque asignado, o NULL si no hay suficiente memoria"
  15544. "para el nuevo bloque."
  15545. ""
  15546. ""
  15547. " ▄▄▄▄▄▄▄▄▄▄▄▄▄"
  15548. " ▌farcoreleft▐   Devuelve la cantidad de memoria no usada en el montón far."
  15549. " ▀▀▀▀▀▀▀▀▀▀▀▀▀"
  15550. ""
  15551. " Sintaxis:"
  15552. "   unsigned long farcoreleft (void);"
  15553. ""
  15554. "Devuelve la cantidad total de espacio libre (en bytes) entre el bloque"
  15555. "asignado más alto y el final de la memoria."
  15556. ""
  15557. ""
  15558. " ▄▄▄▄▄▄▄▄▄"
  15559. " ▌farfree▐   Libera un bloque del montón far."
  15560. " ▀▀▀▀▀▀▀▀▀"
  15561. ""
  15562. " Sintaxis:"
  15563. "   void farfree (void far *bloque);"
  15564. ""
  15565. ""
  15566. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  15567. " ▌farheapcheck▐   Chequea y verifica el montón far."
  15568. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  15569. ""
  15570. " Sintaxis:"
  15571. "   int farheapcheck (void);"
  15572. ""
  15573. "La función farheapcheck() camina a través del montón far y examina cada"
  15574. "bloque, chequeando sus punteros, tamaño, y otros atributos críticos."
  15575. ""
  15576. "El valor devuelto es menor de cero si ocurre un error y mayor de cero si"
  15577. "tiene éxito."
  15578. ""
  15579. ""
  15580. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  15581. " ▌farheapcheckfree▐   Chequea los bloques libres en el montón far para un"
  15582. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   valor constante."
  15583. ""
  15584. " Sintaxis:"
  15585. "   int farheapcheckfree (unsigned int valorrelleno);"
  15586. ""
  15587. "El valor devuelto es menor de cero si ocurre un error y mayor de cero si"
  15588. "tiene éxito."
  15589. ""
  15590. ""
  15591. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  15592. " ▌farheapchecknode▐   Chequea y verifica un nodo simple en el montón far."
  15593. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  15594. ""
  15595. " Sintaxis:"
  15596. "   int farheapchecknode (void *nodo);"
  15597. ""
  15598. "Si un nodo ha sido liberado y farheapchecknode() es llamado con un puntero"
  15599. "al bloque libre, farheapchecknode() puede devolver _BADNODE en vez del"
  15600. "esperado _FREEENTRY. Esto sucede porque los bloques libres adyacentes en"
  15601. "el montón son unidos, y el bloque en cuestión no existe."
  15602. ""
  15603. ""
  15604. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  15605. " ▌farheapfillfree▐   Rellena el bloque libre en el montón far con un valor"
  15606. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   constante."
  15607. ""
  15608. " Sintaxis:"
  15609. "   int farheapfillfree (unsigned int valorrelleno);"
  15610. ""
  15611. "El valor devuelto es menor de cero si ocurre un error y es mayor de cero"
  15612. "si tiene éxito."
  15613. ""
  15614. ""
  15615. " ▄▄▄▄▄▄▄▄▄▄▄▄▄"
  15616. " ▌farheapwalk▐   Camina a través del montón far nodo a nodo."
  15617. " ▀▀▀▀▀▀▀▀▀▀▀▀▀"
  15618. ""
  15619. " Sintaxis:"
  15620. "   int farheapwalk (struct farheapinfo *hi);"
  15621. ""
  15622. "La función farheapwalk() asume que el montón es correcto. Usa farheapcheck()"
  15623. "para verificar el montón antes de usar farheapwalk(). _HEAPOK es devuelto"
  15624. "con el último bloque en el montón. _HEAPEND será devuelto en la próxima"
  15625. "llamada a farheapwalk()."
  15626. ""
  15627. "La estructura farheapinfo está definida del siguiente modo:"
  15628. ""
  15629. " struct heapinfo"
  15630. "   {"
  15631. "     void huge *ptr;"
  15632. "     unsigned long size;"
  15633. "     int in_use;"
  15634. "   };"
  15635. ""
  15636. ""
  15637. " ▄▄▄▄▄▄▄▄▄▄▄"
  15638. " ▌farmalloc▐   Asigma memoria del montón far."
  15639. " ▀▀▀▀▀▀▀▀▀▀▀"
  15640. ""
  15641. " Sintaxis:"
  15642. "   void far *farmalloc (unsigned long nbytes);"
  15643. ""
  15644. "Devuelve un puntero al nuevo bloque asignado, o NULL si no existe suficiente"
  15645. "espacio para el nuevo bloque."
  15646. ""
  15647. ""
  15648. " ▄▄▄▄▄▄▄▄▄▄▄▄"
  15649. " ▌farrealloc▐   Ajusta bloque asignado en montón far."
  15650. " ▀▀▀▀▀▀▀▀▀▀▀▀"
  15651. ""
  15652. " Sintaxis:"
  15653. "   void far *farrealloc (void far *viejobloque, unsigned long nbytes);"
  15654. ""
  15655. "Devuelve la dirección del bloque reasignado, o NULL si falla. La nueva"
  15656. "dirección puede ser diferente a la dirección original."
  15657. ""
  15658. ""
  15659. " ▄▄▄▄▄▄"
  15660. " ▌free▐   Libera bloques asignados con malloc() o calloc()."
  15661. " ▀▀▀▀▀▀"
  15662. ""
  15663. " Sintaxis:"
  15664. "   void free (void *bloque);"
  15665. ""
  15666. ""
  15667. " ▄▄▄▄▄▄▄▄▄▄▄"
  15668. " ▌heapcheck▐   Chequea y verifica el montón."
  15669. " ▀▀▀▀▀▀▀▀▀▀▀"
  15670. ""
  15671. " Sintaxis:"
  15672. "   int heapcheck (void);"
  15673. ""
  15674. "La función farheapcheck() camina a través del montón y examina cada"
  15675. "bloque, chequeando sus punteros, tamaño, y otros atributos críticos."
  15676. ""
  15677. "El valor devuelto es menor de cero si ocurre un error y mayor de cero si"
  15678. "tiene éxito."
  15679. ""
  15680. "Ejemplo:"
  15681. ""
  15682. "  /* Este programa imprime: «El montón está corrompido.» */"
  15683. ""
  15684. "  #include <stdio.h>"
  15685. "  #include <alloc.h>"
  15686. ""
  15687. "  void main (void)"
  15688. "  {"
  15689. "    char *p;"
  15690. ""
  15691. "    p = malloc (100);"
  15692. "    free (p+1);"
  15693. ""
  15694. "    if (heapcheck () < 0)"
  15695. "      printf ("El montón está corrompido.\n");"
  15696. "    else"
  15697. "      printf ("El montón es correcto.\n");"
  15698. "  }"
  15699. ""
  15700. ""
  15701. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  15702. " ▌heapcheckfree▐   Chequea los bloques libres en el montón para un"
  15703. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   valor constante."
  15704. ""
  15705. " Sintaxis:"
  15706. "   int heapcheckfree (unsigned int valorrelleno);"
  15707. ""
  15708. "El valor devuelto es menor de cero si ocurre un error y mayor de cero si"
  15709. "tiene éxito."
  15710. ""
  15711. ""
  15712. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  15713. " ▌heapchecknode▐   Chequea y verifica un nodo simple en el montón."
  15714. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  15715. ""
  15716. " Sintaxis:"
  15717. "   int heapchecknode (void *nodo);"
  15718. ""
  15719. "Si un nodo ha sido liberado y heapchecknode() es llamado con un puntero"
  15720. "al bloque libre, heapchecknode() puede devolver _BADNODE en vez del"
  15721. "esperado _FREEENTRY. Esto sucede porque los bloques libres adyacentes en"
  15722. "el montón son unidos, y el bloque en cuestión no existe."
  15723. ""
  15724. "El valor devuelto es menor de cero si ocurre un error y mayor de cero si"
  15725. "tiene éxito."
  15726. ""
  15727. "Ejemplo:"
  15728. ""
  15729. "  /*"
  15730. "    Este programa imprime (en mi sistema):"
  15731. "    «"
  15732. "    Nodo  0: Entrada libre."
  15733. "    Nodo  1: Entrada usada."
  15734. "    Nodo  2: Entrada libre."
  15735. "    Nodo  3: Entrada usada."
  15736. "    Nodo  4: Entrada libre."
  15737. "    Nodo  5: Entrada usada."
  15738. "    Nodo  6: Entrada libre."
  15739. "    Nodo  7: Entrada usada."
  15740. "    Nodo  8: Entrada libre."
  15741. "    Nodo  8: Entrada usada."
  15742. "    »"
  15743. "    Las macros _HEAPEMPTY, _HEAPCORRUPT, _BADNODE, _FREEENTRY y _USEDENTRY"
  15744. "    están declaradas en el fichero alloc.h"
  15745. "  */"
  15746. ""
  15747. "  #include <stdio.h>"
  15748. "  #include <alloc.h>"
  15749. ""
  15750. "  #define NUM_PTRS  10"
  15751. "  #define NUM_BYTES 16"
  15752. ""
  15753. "  void main (void)"
  15754. "  {"
  15755. "    char * array [NUM_PTRS];"
  15756. "    int i;"
  15757. ""
  15758. "    for (i = 0; i < NUM_PTRS; i++)"
  15759. "      array [i] = malloc (NUM_BYTES);"
  15760. ""
  15761. "    for (i = 0; i < NUM_PTRS; i += 2)"
  15762. "      free (array [i]);"
  15763. ""
  15764. "    for (i = 0; i < NUM_PTRS; i++)"
  15765. "      {"
  15766. "        printf ("Nodo %2d ", i);"
  15767. "        switch (heapchecknode (array [i]))"
  15768. "          {"
  15769. "            case _HEAPEMPTY:"
  15770. "              printf ("Ningún montón.\n");"
  15771. "              break;"
  15772. "            case _HEAPCORRUPT:"
  15773. "              printf ("Montón corrupto.\n");"
  15774. "              break;"
  15775. "            case _BADNODE:"
  15776. "              printf ("Nodo malo.\n");"
  15777. "              break;"
  15778. "            case _FREEENTRY:"
  15779. "              printf ("Entrada libre.\n");"
  15780. "              break;"
  15781. "            case _USEDENTRY:"
  15782. "              printf ("Entrada usada.\n");"
  15783. "              break;"
  15784. "            default:"
  15785. "              printf ("Código de vuelta desconocido.\n");"
  15786. "              break;"
  15787. "          }"
  15788. "     }"
  15789. "  }"
  15790. ""
  15791. ""
  15792. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  15793. " ▌heapfillfree▐   Rellena el bloque libre en el montón con un valor"
  15794. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀   constante."
  15795.  
  15796. " Sintaxis:"
  15797. "   int heapfillfree (unsigned int valorrelleno);"
  15798. ""
  15799. "El valor devuelto es menor de cero si ocurre un error y es mayor de cero"
  15800. "si tiene éxito."
  15801. ""
  15802. ""
  15803. " ▄▄▄▄▄▄▄▄▄▄"
  15804. " ▌heapwalk▐   Camina a través del montón nodo a nodo."
  15805. " ▀▀▀▀▀▀▀▀▀▀"
  15806. ""
  15807. " Sintaxis:"
  15808. "   int heapwalk (struct heapinfo *hi);"
  15809. ""
  15810. "La función heapwalk() asume que el montón es correcto. Usa heapcheck() para"
  15811. "verificar el montón antes de usar heapwalk(). _HEAPOK es devuelto con el"
  15812. "último bloque en el montón. _HEAPEND será devuelto en la próxima llamada"
  15813. "a heapwalk()."
  15814. ""
  15815. "La función heapwalk() recibe un puntero a una estructura de tipo heapinfo"
  15816. "(declarada en alloc.h). Para la primera llamada a heapwalk(), pon el campo"
  15817. "hi.ptr a null. La función heapwalk() devuelve en hi.ptr la dirección del"
  15818. "primer bloque. El campo hi.size contiene el tamaño del bloque en bytes. El"
  15819. "campo h.in_use es un flag que se pone a 1 si el bloque está actualmente en"
  15820. "uso."
  15821. ""
  15822. "La estructura heapinfo está definida del siguiente modo:"
  15823. ""
  15824. " struct heapinfo"
  15825. "   {"
  15826. "     void *ptr;"
  15827. "     unsigned int size;"
  15828. "     int in_use;"
  15829. "   };"
  15830. ""
  15831. ""
  15832. " ▄▄▄▄▄▄▄▄"
  15833. " ▌malloc▐   Asigna memoria principal."
  15834. " ▀▀▀▀▀▀▀▀"
  15835. ""
  15836. " Sintaxis:"
  15837. "   void *malloc (size_t tam);"
  15838. ""
  15839. "El prototipo de esta función también se encuentra en el fichero de"
  15840. "cabecera stdlib.h."
  15841. ""
  15842. "El parámetro tam está en bytes. Devuelve un puntero al nuevo bloque"
  15843. "asignado, o NULL si no existe suficiente espacio para el nuevo bloque."
  15844. "Si tam == 0, devuelve NULL."
  15845. ""
  15846. ""
  15847. " ▄▄▄▄▄▄▄▄▄"
  15848. " ▌realloc▐   Reasigna memoria principal."
  15849. " ▀▀▀▀▀▀▀▀▀"
  15850. ""
  15851. " Sintaxis:"
  15852. "   void *realloc (void *bloque, size_t tam);"
  15853. ""
  15854. "El prototipo de esta función también se encuentra en el fichero de"
  15855. "cabecera stdlib.h."
  15856. ""
  15857. "Intenta achicar o expandir el bloque asignado previamente a tam bytes."
  15858. "Devuelve la dirección del bloque reasignado, la cual puede ser diferente"
  15859. "de la dirección original."
  15860. ""
  15861. "Si el bloque no puede ser reasignado o tam == 0, reallo() devuelve NULL."
  15862. ""
  15863. "Ejemplo:"
  15864. ""
  15865. "  /*"
  15866. "    Este programa imprime (en mi sistema):"
  15867. "    «"
  15868. "    El string es Hola"
  15869. "      Está en la dirección 05A0"
  15870. "    El string es Hola"
  15871. "      Está en la nueva dirección 05AE"
  15872. "    »"
  15873. "  */"
  15874. ""
  15875. "  #include <stdio.h>"
  15876. "  #include <alloc.h>"
  15877. "  #include <string.h>"
  15878. ""
  15879. "  void main (void)"
  15880. "  {"
  15881. "    char *str;"
  15882. ""
  15883. "     /* asigna memoria para string */"
  15884. "    str = malloc (10);"
  15885. ""
  15886. "    /* copia "Hola" en string */"
  15887. "    strcpy (str, "Hola");"
  15888. ""
  15889. "    printf ("El string es %s\n  Está en la dirección %p\n", str, str);"
  15890. "    str = realloc (str, 20);"
  15891. "    printf("El string is %s\n  Está en la nueva dirección %p\n", str, str);"
  15892. ""
  15893. "    /* libera memoria */"
  15894. "    free (str);"
  15895. "  }"
  15896. ""
  15897. ""
  15898. " ▄▄▄▄▄▄"
  15899. " ▌sbrk▐   Cambia la asignación de espacio del segmento de datos."
  15900. " ▀▀▀▀▀▀"
  15901. ""
  15902. " Sintaxis:"
  15903. "   void *sbrk (int incr);"
  15904. ""
  15905. "Suma incr bytes al valor umbral. Si la operación tiene éxito, sbrk()"
  15906. "devuelve el viejo valor umbral. Si falla, devuelve -1 y le da valor a errno."
  15907. ""
  15908. "Ejemplo:"
  15909. ""
  15910. "  /*"
  15911. "    Este programa imprime (en mi sistema):"
  15912. "    «"
  15913. "    Cambiando asignación con sbrk()."
  15914. "    Antes de la llamada a sbrk(): 63504 bytes libres."
  15915. "    Después de la llamada a sbrk(): 62496 bytes libres."
  15916. "    »"
  15917. "  */"
  15918. ""
  15919. "  #include <stdio.h>"
  15920. "  #include <alloc.h>"
  15921. ""
  15922. "  void main (void)"
  15923. "  {"
  15924. "    printf ("Cambiando asignación con sbrk().\n");"
  15925. "    printf ("Antes de la llamada a sbrk(): %lu bytes libres.\n","
  15926. "            (unsigned long) coreleft());"
  15927. "    sbrk (1000);"
  15928. "    printf ("Después de la llamada a sbrk(): %lu bytes libres.\n","
  15929. "            (unsigned long) coreleft());"
  15930. "  }"
  15931. ""
  15932. endvis
  15933. partir
  15934. beginv
  15935. cabecera " FUNCIONES DE PROCESO "
  15936. color 15 3
  15937. centrar_coordenadas
  15938. borde 2
  15939. ""
  15940. "  En el fichero ~<process.h>~ de Turbo C nos    "
  15941. "  encontramos la declaración de una serie   "
  15942. "  de funciones que las podemos dividir en   "
  15943. "  dos grupos: las que terminan el programa  "
  15944. "  en ejecución para volver al sistema ope-  "
  15945. "  rativo y las que ejecutan otro programa.  "
  15946. ""
  15947. endv
  15948. borrar_pantalla
  15949. beginvis
  15950. no_multiatributo
  15951. cabecera " FICHERO DE CABECERA PROCESS.H (TC) "
  15952. coordenadas_completas 1 2 80 24
  15953. color 0 3
  15954. borde 2
  15955. "GLOSARIO:"
  15956. "*********"
  15957. ""
  15958. " ▄▄▄▄▄▄▄"
  15959. " ▌abort▐   Termina un proceso anormalmente."
  15960. " ▀▀▀▀▀▀▀"
  15961. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  15962. " ▌funciones exec...▐   Las funciones exec... permiten a nuestro programa"
  15963. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   ejecutar otros programs (procesos hijos)."
  15964. " ▄▄▄▄▄▄"
  15965. " ▌exit▐   Termina el programa."
  15966. " ▀▀▀▀▀▀"
  15967. " ▄▄▄▄▄▄▄"
  15968. " ▌_exit▐   Termina programa."
  15969. " ▀▀▀▀▀▀▀"
  15970. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄   Las funciones spawn... permiten a nuestros programas"
  15971. " ▌spawn... functions▐   ejecutar procesos hijos (otros programas) y devolver"
  15972. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   el control a nuestro programa cuando el proceso hijo"
  15973. "                        finaliza."
  15974. " ▄▄▄▄▄▄▄▄"
  15975. " ▌system▐   Ejecuta un comando DOS."
  15976. " ▀▀▀▀▀▀▀▀"
  15977. ""
  15978. ""
  15979. "FUNCIONES:"
  15980. "**********"
  15981. ""
  15982. " ▄▄▄▄▄▄▄"
  15983. " ▌abort▐   Termina un proceso anormalmente."
  15984. " ▀▀▀▀▀▀▀"
  15985. ""
  15986. " Sintaxis:"
  15987. "   void abort (void);"
  15988. ""
  15989. "El prototipo de esta función también se encuentra en el fichero stdlib.h"
  15990. ""
  15991. ""
  15992. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  15993. " ▌funciones exec...▐   Las funciones exec... permiten a nuestro programa"
  15994. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   ejecutar otros programs (procesos hijos)."
  15995. ""
  15996. " Sintaxis:"
  15997. "   int execl (char *path, char *arg0, .., NULL);"
  15998. "   int execle (char *path, char *arg0, .., NULL, char **env);"
  15999. "   int execlp (char *path, char *arg0, ..);"
  16000. "   int execlpe (char *path, char *arg0, .., NULL, char **env);"
  16001. ""
  16002. "   int execv (char *path, char *argv[]);"
  16003. "   int execve (char *path, char *argv[], char **env);"
  16004. "   int execvp (char *path, char *argv[]);"
  16005. "   int execvpe (char *path, char *argv[], char **env);"
  16006. ""
  16007. "Cuando se hace una llamada exec..., el proceso hijo ocupa el lugar del"
  16008. "proceso padre. Debe haber suficiente memoria disponible para cargar y"
  16009. "ejecutar el proceso hijo."
  16010. ""
  16011. "Usa execl(), execle(), execlp() y execlpe() cuando conoces todos los"
  16012. "argumentos que tendrá el proceso hijo a ejecutar."
  16013. ""
  16014. "Usa execv(), execve(), execvp() y execvpe() cuando no conoces a priori"
  16015. "los argumentos que tendrá el proceso hijo a ejecutar."
  16016. ""
  16017. "Las letras al final de cada función exec... identifica qué variación se"
  16018. "va a usar:"
  16019. ""
  16020. "  Ltr  │ Variación usada"
  16021. " ══════╪═══════════════════════════════════════════════"
  16022. "   p   │ Busca el path del DOS para el proceso hijo"
  16023. "   l   │ exec pasó una lista fija de argumentos"
  16024. "   v   │ exec pasó una lista variable de argumentos"
  16025. "   e   │ exec pasó un puntero al entorno, permitiendo"
  16026. "       │ alterar el entorno que tendrá el proceso hijo"
  16027. ""
  16028. "Si tiene éxito, las funciones exec no devuelven nada. En caso de error, las"
  16029. "funciones exec devuelven -1 y asigna a errno el código de error."
  16030. ""
  16031. ""
  16032. " ▄▄▄▄▄▄"
  16033. " ▌exit▐   Termina el programa."
  16034. " ▀▀▀▀▀▀"
  16035. ""
  16036. " Sintaxis:"
  16037. "   void exit (int estado);"
  16038. ""
  16039. "Antes de terminar, la salida buffereada es volcada, los ficheros son"
  16040. "cerrados y las funciones exit() son llamadas."
  16041. ""
  16042. "El prototipo de esta función también se encuentra en el fichero stdlib.h."
  16043. ""
  16044. ""
  16045. " ▄▄▄▄▄▄▄"
  16046. " ▌_exit▐   Termina programa."
  16047. " ▀▀▀▀▀▀▀"
  16048. ""
  16049. " Sintaxis:"
  16050. "   void _exit (int estado);"
  16051. ""
  16052. "El prototipo de esta función también se encuentra en el fichero stdlib.h."
  16053. ""
  16054. ""
  16055. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄   Las funciones spawn... permiten a nuestros programas"
  16056. " ▌spawn... functions▐   ejecutar procesos hijos (otros programas) y devolver"
  16057. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   el control a nuestro programa cuando el proceso hijo"
  16058. "                        finaliza."
  16059. " Sintaxis:"
  16060. "   int spawnl (int mode, char *path, char *arg0, ..., NULL);"
  16061. "   int spawnle (int mode, char *path, char *arg0, ..., NULL, char *envp[]);"
  16062. "   int spawnlp (int mode, char *path, char *arg0, ..., NULL);"
  16063. "   int spawnlpe (int mode, char *path, char *arg0, ..., NULL, char *envp[]);"
  16064. ""
  16065. "   int spawnv (int mode, char *path, char *argv[]);"
  16066. "   int spawnve (int mode, char *path, char *argv[], char *envp[]);"
  16067. "   int spawnvp (int mode, char *path, char *argv[]);"
  16068. "   int spawnvpe (int mode, char *path, char *argv[], char *envp[]);"
  16069. ""
  16070. "Usa spawnl(), spawnle(), spawnlp() y spawnlpe() cuando conoces todos los"
  16071. "argumentos que tendrá el proceso hijo a ejecutar."
  16072. ""
  16073. "Usa spawnv(), spawnve(), spawnvp() y spawnvpe() cuando no conoces a priori"
  16074. "los argumentos que tendrá el proceso hijo a ejecutar."
  16075. ""
  16076. "Las letras al final de cada función spawn... identifica qué variación se"
  16077. "va a usar:"
  16078. ""
  16079. "  Ltr  │ Variación usada"
  16080. " ══════╪═══════════════════════════════════════════════"
  16081. "   p   │ Busca el path del DOS para el proceso hijo"
  16082. "   l   │ spawn pasó una lista fija de argumentos"
  16083. "   v   │ spawn pasó una lista variable de argumentos"
  16084. "   e   │ spawn pasó un puntero al entorno, permitiendo"
  16085. "       │ alterar el entorno que tendrá el proceso hijo"
  16086. ""
  16087. "Si la ejecución tiene éxito, el valor devuelto es el estado de salida del"
  16088. "proceso hijo (0 para terminación normal)."
  16089. ""
  16090. "Si el proceso no puede ser ejecutado, las funciones spawn... devolverán -1."
  16091. ""
  16092. ""
  16093. " ▄▄▄▄▄▄▄▄"
  16094. " ▌system▐   Ejecuta un comando DOS."
  16095. " ▀▀▀▀▀▀▀▀"
  16096. ""
  16097. " Sintaxis:"
  16098. "   int system (const char *comando);"
  16099. ""
  16100. "El prototipo de esta función también se encuentra en el fichero stdlib.h."
  16101. ""
  16102. "comando puede ejecutar un comando interno del DOS tales como DIR, un fichero"
  16103. "de programa .COM o .EXE, o un fichero batch .BAT."
  16104. ""
  16105. "Devuelve 0 en caso de éxito, -1 en caso de error y se le asigna a errno uno"
  16106. "de los siguientes valores: ENOENT, ENOMEM, E2BIG o ENOEXEC."
  16107. ""
  16108. "La función system() también se encuentra declarada en los ficheros stdlib.h"
  16109. "y system.h. En el fichero system.h sólo se encuentra el prototipo de la"
  16110. "función system()."
  16111. ""
  16112. ""
  16113. "CONSTANTES, TIPOS DE DATOS, Y VARIABLES GLOBALES:"
  16114. "*************************************************"
  16115. ""
  16116. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  16117. "  P_xxxx (#defines)"
  16118. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  16119. ""
  16120. "Modos usados por las funciones spawn."
  16121. ""
  16122. " P_WAIT      El proceso hijo se ejecuta separadamente,"
  16123. "             el proceso padre espera a la salida del hijo."
  16124. " P_NOWAIT    Los procesos hijo y padre se ejecutan concurrentemente."
  16125. "             (No implementado.)"
  16126. " P_OVERLAY   El proceso hijo reemplaza al proceso padre de tal forma"
  16127. "             que el padre ya no existe."
  16128. ""
  16129. ""
  16130. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  16131. "  _psp (variable global)"
  16132. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  16133. ""
  16134. "Dirección del segmento del PSP (Prefijo de Segmento de Programa) del"
  16135. "programa."
  16136. ""
  16137. "  extern unsigned int _psp;"
  16138. ""
  16139. "Esta variable también se encuentra declarada en los ficheros dos.h y"
  16140. "stdlib.h."
  16141. ""
  16142. endvis
  16143. ;partir
  16144. beginv
  16145. cabecera " FUNCIONES DE DIRECTORIO "
  16146. color 15 3
  16147. centrar_coordenadas
  16148. borde 2
  16149. ""
  16150. "  En el fichero de cabecera  "
  16151. "  ~<dir.h>~ de Turbo C tene-"
  16152. "  mos declaradas una serie"
  16153. "  de funciones relacionadas"
  16154. "  con los directorios."
  16155. ""
  16156. endv
  16157. borrar_pantalla
  16158. beginvis
  16159. no_multiatributo
  16160. cabecera " FICHERO DE CABECERA DIR.H (TC) "
  16161. coordenadas_completas 1 2 80 24
  16162. color 0 3
  16163. borde 2
  16164. "GLOSARIO:"
  16165. "*********"
  16166. ""
  16167. " ▄▄▄▄▄▄▄"
  16168. " ▌chdir▐   Cambia directorio actual."
  16169. " ▀▀▀▀▀▀▀"
  16170. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  16171. " ▌findfirst and findnext▐   Busca directorio de disco."
  16172. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   Continúa búsqueda de findfirst()."
  16173. " ▄▄▄▄▄▄▄▄▄"
  16174. " ▌fnmerge▐   Construye un path de sus partes componentes."
  16175. " ▀▀▀▀▀▀▀▀▀"
  16176. " ▄▄▄▄▄▄▄▄▄"
  16177. " ▌fnsplit▐   Descompone un nombre de path en sus partes componentes."
  16178. " ▀▀▀▀▀▀▀▀▀"
  16179. " ▄▄▄▄▄▄▄▄▄▄▄"
  16180. " ▌getcurdir▐   Obtiene directorio actual para la unidad especificada."
  16181. " ▀▀▀▀▀▀▀▀▀▀▀"
  16182. " ▄▄▄▄▄▄▄▄"
  16183. " ▌getcwd▐   Obtiene directorio de trabajo actual."
  16184. " ▀▀▀▀▀▀▀▀"
  16185. " ▄▄▄▄▄▄▄▄▄"
  16186. " ▌getdisk▐   Obtiene unidad actual."
  16187. " ▀▀▀▀▀▀▀▀▀"
  16188. " ▄▄▄▄▄▄▄"
  16189. " ▌mkdir▐   Crea un directorio."
  16190. " ▀▀▀▀▀▀▀"
  16191. " ▄▄▄▄▄▄▄▄"
  16192. " ▌mktemp▐   Hace un nombre de fichero único."
  16193. " ▀▀▀▀▀▀▀▀"
  16194. " ▄▄▄▄▄▄▄"
  16195. " ▌rmdir▐   Quita un directorio."
  16196. " ▀▀▀▀▀▀▀"
  16197. " ▄▄▄▄▄▄▄▄▄▄▄▄"
  16198. " ▌searchpath▐   Busca el path del DOS para un determinado fichero."
  16199. " ▀▀▀▀▀▀▀▀▀▀▀▀"
  16200. " ▄▄▄▄▄▄▄▄▄"
  16201. " ▌setdisk▐   Pone la unidad de disco actual."
  16202. " ▀▀▀▀▀▀▀▀▀"
  16203.  
  16204. " ▄▄▄▄▄▄▄"
  16205. " ▌chdir▐   Cambia directorio actual."
  16206. " ▀▀▀▀▀▀▀"
  16207. ""
  16208. " Sintaxis:"
  16209. "   int chdir (const char *path);"
  16210. ""
  16211. "Si la operación tiene éxito, chdir() devuelve 0. En otro caso, devuelve -1"
  16212. "y asigna a errno código de error."
  16213. ""
  16214. ""
  16215. "FUNCIONES:"
  16216. "**********"
  16217. ""
  16218. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  16219. " ▌findfirst and findnext▐   Busca directorio de disco."
  16220. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   Continúa búsqueda de findfirst()."
  16221. ""
  16222. " Sintaxis:"
  16223. "  int findfirst (const char *nombrepath, struct ffblk *ffblk, int atributo);"
  16224. "  int findnext (struct ffblk *ffblk);"
  16225. ""
  16226. "El path de especificación de fichero puede contener estos caracteres"
  16227. "comodín:"
  16228. ""
  16229. "  ? (coincidencia de un carácter)"
  16230. "  * (coincidencia de una serie de caracteres)"
  16231. ""
  16232. "Devuelve 0 si tiene éxito; devuelve -1 si ocurre un error, y se le asigna"
  16233. "a errno el código de error."
  16234. ""
  16235. "Ejemplo:"
  16236. ""
  16237. "  #include <stdio.h>"
  16238. "  #include <dir.h>"
  16239. ""
  16240. "  int main (void)"
  16241. "  {"
  16242. "    struct ffblk ffblk;"
  16243. "    int hecho;"
  16244. ""
  16245. "    printf ("Listado de directorio *.*\n");"
  16246. "    hecho = findfirst ("*.*", &ffblk, 0);"
  16247. "    while (! hecho)"
  16248. "      {"
  16249. "        printf ("  %s\n", ffblk.ff_name);"
  16250. "        hecho = findnext (&ffblk);"
  16251. "      }"
  16252. ""
  16253. "    return 0;"
  16254. "  }"
  16255. ""
  16256. ""
  16257. " ▄▄▄▄▄▄▄▄▄"
  16258. " ▌fnmerge▐   Construye un path de sus partes componentes."
  16259. " ▀▀▀▀▀▀▀▀▀"
  16260. ""
  16261. " Sintaxis:"
  16262. "   void fnmerge (char *path, const char *unidad, const char *dir,"
  16263. "                 const char *nombre, const char *ext);"
  16264. ""
  16265. "Ejemplo:"
  16266. ""
  16267. "  #include <string.h>"
  16268. "  #include <stdio.h>"
  16269. "  #include <dir.h>"
  16270. ""
  16271. "  int main (void)"
  16272. "  {"
  16273. "    char s[MAXPATH];"
  16274. "    char unidad[MAXDRIVE];"
  16275. "    char dir[MAXDIR];"
  16276. "    char fichero[MAXFILE];"
  16277. "    char ext[MAXEXT];"
  16278. ""
  16279. "    getcwd (s, MAXPATH); /* obtiene el directorio de trabajo actual */"
  16280. "    if (s[strlen(s)-1] != '\\')"
  16281. "      strcat (s,"\\"); /* añade un carácter \ al final */"
  16282. "    fnsplit (s, unidad, dir, fichero, ext); /* descompone el string en"
  16283. "                                               elementos separados */"
  16284. "    strcpy (fichero, "DATOS");"
  16285. "    strcpy (ext," .TXT");"
  16286. "    fnmerge (s, unidad, dir, fichero, ext); /*fusiona todas las componentes*/"
  16287. "    puts (s); /* visualiza el string resultado */"
  16288. ""
  16289. "    return 0;"
  16290. "  }"
  16291. ""
  16292. ""
  16293. " ▄▄▄▄▄▄▄▄▄"
  16294. " ▌fnsplit▐   Descompone un nombre de path en sus partes componentes."
  16295. " ▀▀▀▀▀▀▀▀▀"
  16296. ""
  16297. " Sintaxis:"
  16298. "   int fnsplit (const char *path, char *unidad, char *dir, char *nombre,"
  16299. "                char *ext);"
  16300. ""
  16301. "Devuelve un entero compuesto de cinco flags."
  16302. ""
  16303. "Ejemplo:"
  16304. ""
  16305. "  #include <stdlib.h>"
  16306. "  #include <stdio.h>"
  16307. "  #include <dir.h>"
  16308. ""
  16309. "  int main (void)"
  16310. "  {"
  16311. "    char *s;"
  16312. "    char unidad[MAXDRIVE];"
  16313. "    char dir[MAXDIR];"
  16314. "    char fichero[MAXFILE];"
  16315. "    char ext[MAXEXT];"
  16316. "    int flags;"
  16317. ""
  16318. "    s = getenv ("COMSPEC"); /* obtiene la especificación de nombre completa"
  16319. "                               de command.com */"
  16320. "    flags = fnsplit (s, unidad, dir, fichero, ext);"
  16321. ""
  16322. "    printf ("Información del procesador de comando:\n");"
  16323. "    if (flags & DRIVE)"
  16324. "      printf ("\tunidad: %s\n", unidad);"
  16325. "    if (flags & DIRECTORY)"
  16326. "      printf ("\tdirectorio: %s\n",dir);"
  16327. "    if (flags & FILENAME)"
  16328. "      printf ("\tfichero: %s\n", fichero);"
  16329. "    if (flags & EXTENSION)"
  16330. "      printf ("\textensión: %s\n", ext);"
  16331. ""
  16332. "    return 0;"
  16333. "  }"
  16334. ""
  16335. ""
  16336. " ▄▄▄▄▄▄▄▄▄▄▄"
  16337. " ▌getcurdir▐   Obtiene directorio actual para la unidad especificada."
  16338. " ▀▀▀▀▀▀▀▀▀▀▀"
  16339. ""
  16340. " Sintaxis:"
  16341. "   int getcurdir (int unidad, char *directorio);"
  16342. ""
  16343. "unidad es 0 para la unidad por defecto, 1 para A, 2 para B, etc."
  16344. ""
  16345. "Devuelve 0 si tiene éxito y -1 si hay algún error."
  16346. ""
  16347. ""
  16348. " ▄▄▄▄▄▄▄▄"
  16349. " ▌getcwd▐   Obtiene directorio de trabajo actual."
  16350. " ▀▀▀▀▀▀▀▀"
  16351. ""
  16352. " Sintaxis:"
  16353. "   char *getcwd (char *buffer, int longitud_buffer);"
  16354. ""
  16355. "Devuelve un puntero a buffer; en caso de error, devuelve NULL y a errno"
  16356. "se le asigna el código de error."
  16357. ""
  16358. "Ejemplo:"
  16359. ""
  16360. "  #include <stdio.h>"
  16361. "  #include <dir.h>"
  16362. ""
  16363. "  int main (void)"
  16364. "  {"
  16365. "     char buffer [MAXPATH];"
  16366. ""
  16367. "     getcwd (buffer, MAXPATH);"
  16368. "     printf ("El directorio actual es: %s\n", buffer);"
  16369. "     return 0;"
  16370. "  }"
  16371. ""
  16372. ""
  16373. " ▄▄▄▄▄▄▄▄▄"
  16374. " ▌getdisk▐   Obtiene unidad actual."
  16375. " ▀▀▀▀▀▀▀▀▀"
  16376. ""
  16377. " Sintaxis:"
  16378. "   int getdisk (void);"
  16379. ""
  16380. "Devuelve la unidad actual. La unidad A es la 0."
  16381. ""
  16382. "Ejemplo:"
  16383. ""
  16384. "  #include <stdio.h>"
  16385. "  #include <dir.h>"
  16386. ""
  16387. "  int main (void)"
  16388. "  {"
  16389. "     int disco;"
  16390. ""
  16391. "     disk = getdisk () + 'A';"
  16392. "     printf ("La unidad actual es: %c\n", disco);"
  16393. "     return 0;"
  16394. "  }"
  16395. ""
  16396. ""
  16397. " ▄▄▄▄▄▄▄"
  16398. " ▌mkdir▐   Crea un directorio."
  16399. " ▀▀▀▀▀▀▀"
  16400. ""
  16401. " Sintaxis:"
  16402. "   int mkdir (const char *path);"
  16403. ""
  16404. "Devuelve 0 si tiene éxito; -1 en caso de error y se asigna código de error"
  16405. "a errno."
  16406. ""
  16407. "Ejemplo:"
  16408. ""
  16409. "  #include <stdio.h>"
  16410. "  #include <conio.h>"
  16411. "  #include <process.h>"
  16412. "  #include <dir.h>"
  16413. ""
  16414. "  int main (void)"
  16415. "  {"
  16416. "    int estado;"
  16417. ""
  16418. "    clrscr ();"
  16419. "    estado = mkdir ("asdfjklm");"
  16420. "    (! estado) ? (printf ("Directorio creado\n")) :"
  16421. "                 (printf ("No es posible crear directorio\n"));"
  16422. ""
  16423. "     getch ();"
  16424. "     system ("dir");"
  16425. "     getch ();"
  16426. ""
  16427. "     estado = rmdir ("asdfjklm");"
  16428. "     (! estado) ? (printf ("Directorio borrado\n")) :"
  16429. "                  (perror ("No es posible borrar directorio\n"));"
  16430. ""
  16431. "     return 0;"
  16432. "  }"
  16433. ""
  16434. ""
  16435. " ▄▄▄▄▄▄▄▄"
  16436. " ▌mktemp▐   Hace un nombre de fichero único."
  16437. " ▀▀▀▀▀▀▀▀"
  16438. ""
  16439. " Sintaxis:"
  16440. "   char *mktemp (char *nomfich);"
  16441. ""
  16442. "Reemplaza nomfich por un nombre de fichero único y devuelve la dirección"
  16443. "de nomfich; nomfich debería ser una cadena terminada en nulo con 6 X's"
  16444. "restantes. Por ejemplo, "MIFICHXXXXXX"."
  16445. ""
  16446. "Ejemplo:"
  16447. ""
  16448. "  #include <dir.h>"
  16449. "  #include <stdio.h>"
  16450. ""
  16451. "  int main (void)"
  16452. "  {"
  16453. "     char *nombref = "TXXXXXX", *ptr;"
  16454. ""
  16455. "     ptr = mktemp (nombref);"
  16456. "     printf ("%s\n", ptr);"
  16457. "     return 0;"
  16458. "  }"
  16459. ""
  16460. ""
  16461. " ▄▄▄▄▄▄▄"
  16462. " ▌rmdir▐   Quita un directorio."
  16463. " ▀▀▀▀▀▀▀"
  16464. ""
  16465. " Sintaxis:"
  16466. "   int rmdir (const char *path);"
  16467. ""
  16468. "Devuelve 0 si tiene éxio; en caso de error, devuelve -1 y en errno se pone"
  16469. "el código de error."
  16470. ""
  16471. "Ejemplo:"
  16472. ""
  16473. "  #include <stdio.h>"
  16474. "  #include <conio.h>"
  16475. "  #include <process.h>"
  16476. "  #include <dir.h>"
  16477. ""
  16478. "  #define NOMBREDIR "testdir.$$$""
  16479. ""
  16480. "  int main (void)"
  16481. "  {"
  16482. "    int estado;"
  16483. ""
  16484. "    estado = mkdir (NOMBREDIR);"
  16485. "    if (! estado)"
  16486. "      printf ("Directorio creado\n");"
  16487. "    else"
  16488. "      {"
  16489. "        printf ("No es posible crear directorio\n");"
  16490. "        exit (1);"
  16491. "      }"
  16492. ""
  16493. "    getch ();"
  16494. "    system ("dir/p");"
  16495. "    getch ();"
  16496. ""
  16497. "    estado = rmdir (NOMBREDIR);"
  16498. "    if (! estado)"
  16499. "      printf ("\nDirectorio borrado\n");"
  16500. "    else"
  16501. "      {"
  16502. "        perror ("\nNo es posible borrar directorio\n");"
  16503. "        exit (1);"
  16504. "      }"
  16505. ""
  16506. "    return 0;"
  16507. "  }"
  16508. ""
  16509. ""
  16510. " ▄▄▄▄▄▄▄▄▄▄▄▄"
  16511. " ▌searchpath▐   Busca el path del DOS para un determinado fichero."
  16512. " ▀▀▀▀▀▀▀▀▀▀▀▀"
  16513. ""
  16514. " Sintaxis:"
  16515. "   char *searchpath (const char *fichero);"
  16516. ""
  16517. "Devuelve un puntero a una cadena con el nombre de path completo de fichero"
  16518. "si tiene éxito; en otro caso, devuelve NULL. Esta cadena está en un área"
  16519. "estática que es sobreescrita en cada nueva llamada."
  16520. ""
  16521. "Ejemplo:"
  16522. ""
  16523. "  #include <stdio.h>"
  16524. "  #include <dir.h>"
  16525. ""
  16526. "  int main (void)"
  16527. "  {"
  16528. "    char *p;"
  16529. ""
  16530. "    /* Busca TLINK.EXE y devuelve un puntero al path */"
  16531. "    p = searchpath ("TLINK.EXE");"
  16532. "    printf ("Búsqueda para TLINK.EXE: %s\n", p);"
  16533. ""
  16534. "    /* Busca un fichero no existente */"
  16535. "    p = searchpath ("NOEXISTE.FIL");"
  16536. "    printf ("Búsqueda para NOEXISTE.FIL: %s\n", p);"
  16537. ""
  16538. "    return 0;"
  16539. "  }"
  16540. ""
  16541. ""
  16542. " ▄▄▄▄▄▄▄▄▄"
  16543. " ▌setdisk▐   Pone la unidad de disco actual."
  16544. " ▀▀▀▀▀▀▀▀▀"
  16545. ""
  16546. " Sintaxis:"
  16547. "   int setdisk (int unidad);"
  16548. ""
  16549. "Los valores pra unidad son"
  16550. ""
  16551. "  0 = A"
  16552. "  1 = B"
  16553. "  2 = C"
  16554. "  etc."
  16555. ""
  16556. "Devuelve el número total de unidades disponibles."
  16557. ""
  16558. "Ejemplo:"
  16559. ""
  16560. "  #include <stdio.h>"
  16561. "  #include <dir.h>"
  16562. ""
  16563. "  int main (void)"
  16564. "  {"
  16565. "    int salvar, disco, discos;"
  16566. ""
  16567. "    /* salvar unidad original */"
  16568. "    salvar = getdisk ();"
  16569. ""
  16570. "    /* imprimir número de unidades lógicas */"
  16571. "    discos = setdisk (salvar);"
  16572. "    printf ("%d unidades lógicas en el sistema\n\n", discos);"
  16573. ""
  16574. "    /* imprime las letras de unidad disponible */"
  16575. "    printf ("Unidades disponibles:\n");"
  16576. "    for (disco = 0; disco < 26; ++disco)"
  16577. "      {"
  16578. "        setdisk (disco);"
  16579. "        if (disco == getdisk ())"
  16580. "          printf("%c: unidad disponible\n", disco + 'a');"
  16581. "      }"
  16582. "    setdisk (salvar);"
  16583. ""
  16584. "    return 0;"
  16585. "  }"
  16586. ""
  16587. ""
  16588. "CONSTANTES, TIPOS DE DATOS, Y VARIABLES GLOBALES:"
  16589. "*************************************************"
  16590. ""
  16591. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  16592. "  FFBLK (struct)"
  16593. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  16594. ""
  16595. "Estructura de bloque de control de fichero del DOS."
  16596. ""
  16597. "  struct ffblk"
  16598. "    {"
  16599. "      char      ff_reserved[21];"
  16600. "      char      ff_attrib;"
  16601. "      unsigned  ff_ftime;"
  16602. "      unsigned  ff_fdate;"
  16603. "      long      ff_fsize;"
  16604. "      char      ff_name[13];"
  16605. "    };"
  16606. ""
  16607. ""
  16608. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  16609. "  fnsplit (#defines)"
  16610. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  16611. ""
  16612. "Definiciones de bits devueltos por fnsplit para identificar qué partes de"
  16613. "un nombre de fichero fueron encontrados durante la descomposición."
  16614. ""
  16615. "  WILDCARDS   El Path contiene caracteres comodín"
  16616. "  EXTENSION   El path incluye extensión"
  16617. "  FILENAME    El path incluye un nombre de fichero"
  16618. "  DIRECTORY   El path incluye un subdirectorio"
  16619. "  DRIVE       El path incluye una unidad"
  16620. ""
  16621. endvis
  16622. beginv
  16623. cabecera " FUNCIONES DEL DOS "
  16624. color 15 3
  16625. centrar_coordenadas_x 3
  16626. borde 2
  16627. ""
  16628. "  En el fichero ~<dos.h>~ de Turbo C nos  "
  16629. "  encontramos información (declaración    "
  16630. "  de funciones, constantes, tipos, es-    "
  16631. "  tructuras, ...) relacionadas con el     "
  16632. "  sistema operativo DOS. Todas estas      "
  16633. "  funciones interactúan directamente      "
  16634. "  con el sistema operativo y por ello     "
  16635. "  no están definidas en el estándar ANSI. "
  16636. ""
  16637. endv
  16638. beginv
  16639. cabecera " FUNCIONES DE INTERRUPCION "
  16640. color 15 3
  16641. centrar_coordenadas_x 5
  16642. ""
  16643. "  Turbo C posee la palabra clave ~interrupt~ que define una función como  "
  16644. "  un manejador de interrupción. La sintaxis de esta palabra clave es:"
  16645. ""
  16646. "    ~interrupt definicion_de_funcion;~"
  16647. ""
  16648. "  Las funciones de interrupción son llamadas por el sistema cuando se"
  16649. "  genera alguna interrupción. En estas funciones se salvan todos los"
  16650. "  registros de la CPU y se terminan con la instrucción IRET."
  16651. ""
  16652. "  Cuando en Turbo C usemos la palabra clave interrupt en un programa"
  16653. "  tenemos que desactivar el chequeo de pila y el uso de variables re-"
  16654. "  gistros en el entorno."
  16655. ""
  16656. endv
  16657. borrar_pantalla
  16658. beginvis
  16659. no_multiatributo
  16660. cabecera " FICHERO DE CABECERA DOS.H (TC) "
  16661. coordenadas_completas 1 2 80 24
  16662. color 0 3
  16663. borde 2
  16664. "GLOSARIO:"
  16665. "*********"
  16666. ""
  16667. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  16668. " ▌absread  y  abswrite▐   absread() lee sectores absolutos de disco."
  16669. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   abswrite() escribe sectores absolutos de disco."
  16670. " ▄▄▄▄▄▄▄▄▄▄"
  16671. " ▌allocmem▐   Asigna memoria."
  16672. " ▀▀▀▀▀▀▀▀▀▀"
  16673. " ▄▄▄▄▄▄"
  16674. " ▌bdos▐   Invoca una función del DOS, forma corta."
  16675. " ▀▀▀▀▀▀"
  16676. " ▄▄▄▄▄▄▄▄▄"
  16677. " ▌bdosptr▐   LLamada al sistema MS-DOS."
  16678. " ▀▀▀▀▀▀▀▀▀"
  16679. " ▄▄▄▄▄▄▄▄▄"
  16680. " ▌country▐   Devuelve información dependiente del país."
  16681. " ▀▀▀▀▀▀▀▀▀"
  16682. " ▄▄▄▄▄▄▄▄▄"
  16683. " ▌ctrlbrk▐   Pone manejador de control-break."
  16684. " ▀▀▀▀▀▀▀▀▀"
  16685. " ▄▄▄▄▄▄▄"
  16686. " ▌delay▐   Suspende la ejecución durante un intervalo (en milisegundos)."
  16687. " ▀▀▀▀▀▀▀"
  16688. " ▄▄▄▄▄▄▄▄▄"
  16689. " ▌disable▐   Inhabilita las interrupciones."
  16690. " ▀▀▀▀▀▀▀▀▀"
  16691. " ▄▄▄▄▄▄▄▄▄▄▄"
  16692. " ▌dosexterr▐   Obtiene información de error extendido del DOS."
  16693. " ▀▀▀▀▀▀▀▀▀▀▀"
  16694. " ▄▄▄▄▄▄▄▄▄▄▄"
  16695. " ▌dostounix▐   Convierte fecha y hora a formato de hora UNIX."
  16696. " ▀▀▀▀▀▀▀▀▀▀▀"
  16697. " ▄▄▄▄▄▄▄▄▄▄"
  16698. " ▌__emit__▐   Inserta valores literales directamente dentro del código."
  16699. " ▀▀▀▀▀▀▀▀▀▀"
  16700. " ▄▄▄▄▄▄▄▄"
  16701. " ▌enable▐   Habilita las interrupciones hardware."
  16702. " ▀▀▀▀▀▀▀▀"
  16703. "▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄■Obtiene el offset de una direc. far (FP_OFF)"
  16704. "▌macros FP_OFF, FP_SEG y MK_FP▐■Obtiene el segmento de una direc. far(FP_SEG)"
  16705. "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀■Hace un puntero far (MK_FP)."
  16706. " ▄▄▄▄▄▄▄▄▄"
  16707. " ▌freemem▐   Libera un bloque de momoria del DOS asignado previamente con"
  16708. " ▀▀▀▀▀▀▀▀▀   allocmen()."
  16709. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  16710. " ▌geninterrupt▐   Macro que genera una interrupción software."
  16711. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  16712. " ▄▄▄▄▄▄▄▄▄"
  16713. " ▌getcbrk▐   Obtiene el estado de control-break."
  16714. " ▀▀▀▀▀▀▀▀▀"
  16715. " ▄▄▄▄▄▄▄▄▄"
  16716. " ▌getdate▐   Obtiene fecha del sistema (DOS)."
  16717. " ▀▀▀▀▀▀▀▀▀"
  16718. " ▄▄▄▄▄▄▄▄▄▄"
  16719. " ▌getdfree▐   Obtiene el espacio libre de disco."
  16720. " ▀▀▀▀▀▀▀▀▀▀"
  16721. " ▄▄▄▄▄▄▄▄"
  16722. " ▌getdta▐   Obtiene la dirección de transferenciad de disco."
  16723. " ▀▀▀▀▀▀▀▀"
  16724. " ▄▄▄▄▄▄▄▄"
  16725. " ▌getfat▐   Obtiene información sobre la tabla de asignación de ficheros"
  16726. " ▀▀▀▀▀▀▀▀   para la unidad dada."
  16727. " ▄▄▄▄▄▄▄▄▄"
  16728. " ▌getfatd▐   Obtiene información sobre la tabla de asignación de fichero."
  16729. " ▀▀▀▀▀▀▀▀▀"
  16730. " ▄▄▄▄▄▄▄▄▄▄"
  16731. " ▌getftime▐   Obtiene la fecha y hora de un fichero."
  16732. " ▀▀▀▀▀▀▀▀▀▀"
  16733. " ▄▄▄▄▄▄▄▄"
  16734. " ▌getpsp▐   Obtiene el prefijo de segmento de programa."
  16735. " ▀▀▀▀▀▀▀▀"
  16736. " ▄▄▄▄▄▄▄▄▄"
  16737. " ▌gettime▐   Obtiene la hora del sistema."
  16738. " ▀▀▀▀▀▀▀▀▀"
  16739. " ▄▄▄▄▄▄▄▄▄"
  16740. " ▌getvect▐   Obtiene un vector de interrupción."
  16741. " ▀▀▀▀▀▀▀▀▀"
  16742. " ▄▄▄▄▄▄▄▄▄▄▄"
  16743. " ▌getverify▐   Obtiene el estado de verificacion."
  16744. " ▀▀▀▀▀▀▀▀▀▀▀"
  16745. " ▄▄▄▄▄▄▄▄▄"
  16746. " ▌harderr▐   Establece un manejador de error hardware."
  16747. " ▀▀▀▀▀▀▀▀▀"
  16748. " ▄▄▄▄▄▄▄▄▄▄▄▄"
  16749. " ▌hardresume▐   Función de manejador de error hardware."
  16750. " ▀▀▀▀▀▀▀▀▀▀▀▀"
  16751. " ▄▄▄▄▄▄▄▄▄▄"
  16752. " ▌hardretn▐   Manejador de error hardware."
  16753. " ▀▀▀▀▀▀▀▀▀▀"
  16754. " ▄▄▄▄▄"
  16755. " ▌inp▐   Macro que lee un byte de un puerto hardware."
  16756. " ▀▀▀▀▀"
  16757. " ▄▄▄▄▄▄▄▄▄"
  16758. " ▌inportb▐   Lee un byte de un puerto hardware."
  16759. " ▀▀▀▀▀▀▀▀▀"
  16760. " ▄▄▄▄▄▄▄"
  16761. " ▌int86▐   Interrupción de software 8086."
  16762. " ▀▀▀▀▀▀▀"
  16763. " ▄▄▄▄▄▄▄▄"
  16764. " ▌int86x▐   Interfase de interrupción software 8086."
  16765. " ▀▀▀▀▀▀▀▀"
  16766. " ▄▄▄▄▄▄▄▄"
  16767. " ▌intdos▐   Interfase de interrupción DOS."
  16768. " ▀▀▀▀▀▀▀▀"
  16769. " ▄▄▄▄▄▄▄▄▄"
  16770. " ▌intdosx▐   Interfase de interrupción DOS."
  16771. " ▀▀▀▀▀▀▀▀▀"
  16772. " ▄▄▄▄▄▄"
  16773. " ▌intr▐   Interfase de interrupción software 8086."
  16774. " ▀▀▀▀▀▀"
  16775. " ▄▄▄▄▄▄"
  16776. " ▌keep▐   Termina y queda residente."
  16777. " ▀▀▀▀▀▀"
  16778. " ▄▄▄▄▄▄▄▄▄"
  16779. " ▌nosound▐   Desactiva el altavoz del PC."
  16780. " ▀▀▀▀▀▀▀▀▀"
  16781. " ▄▄▄▄▄▄"
  16782. " ▌outp▐   Macro que escribe un byte en un puerto hardware."
  16783. " ▀▀▀▀▀▀"
  16784. " ▄▄▄▄▄▄▄▄▄"
  16785. " ▌outport▐   Escribe una palabra en un puerto hardware."
  16786. " ▀▀▀▀▀▀▀▀▀"
  16787. " ▄▄▄▄▄▄▄▄▄▄"
  16788. " ▌outportb▐   Escribe un byte en un puerto hardware."
  16789. " ▀▀▀▀▀▀▀▀▀▀"
  16790. " ▄▄▄▄▄▄▄▄▄"
  16791. " ▌parsfnm▐   Analiza un nombre de fichero y construye un bloque de control"
  16792. " ▀▀▀▀▀▀▀▀▀   de fichero (FCB)."
  16793. " ▄▄▄▄▄▄"
  16794. " ▌peek▐   Devuelve la palabra que hay en la localización de memoria"
  16795. " ▀▀▀▀▀▀   especificada por segmento:desplazamiento."
  16796. " ▄▄▄▄▄▄▄"
  16797. " ▌peekb▐   Devuelve el byte que hay en la localización de memoria"
  16798. " ▀▀▀▀▀▀▀   especificada por segmento:desplazamiento."
  16799. " ▄▄▄▄▄▄"
  16800. " ▌poke▐   Almacena un valor entero en la posición de memoria especificada"
  16801. " ▀▀▀▀▀▀   por segmento:desplazamiento."
  16802. " ▄▄▄▄▄▄▄"
  16803. " ▌pokeb▐   Almacena un byte en la posición de memoria especificada"
  16804. " ▀▀▀▀▀▀▀   por segmento:desplazamiento."
  16805. " ▄▄▄▄▄▄▄▄▄"
  16806. " ▌randbrd▐   Lee bloque aleatorio."
  16807. " ▀▀▀▀▀▀▀▀▀"
  16808. " ▄▄▄▄▄▄▄▄▄"
  16809. " ▌randbwr▐   Escribe bloque aleatorio usando el bloque de control de"
  16810. " ▀▀▀▀▀▀▀▀▀   fichero (FCB)."
  16811. " ▄▄▄▄▄▄▄▄▄"
  16812. " ▌segread▐   Lee registros del segmento."
  16813. " ▀▀▀▀▀▀▀▀▀"
  16814. " ▄▄▄▄▄▄▄▄▄▄"
  16815. " ▌setblock▐   Modifica el tamaño de un bloque asignado previamente."
  16816. " ▀▀▀▀▀▀▀▀▀▀"
  16817. " ▄▄▄▄▄▄▄▄▄"
  16818. " ▌setcbrk▐   Pone el estado de control-break."
  16819. " ▀▀▀▀▀▀▀▀▀"
  16820. " ▄▄▄▄▄▄▄▄▄"
  16821. " ▌setdate▐   Pone la fecha del DOS."
  16822. " ▀▀▀▀▀▀▀▀▀"
  16823. " ▄▄▄▄▄▄▄▄"
  16824. " ▌setdta▐   Pone la dirección de transferencia de disco."
  16825. " ▀▀▀▀▀▀▀▀"
  16826. " ▄▄▄▄▄▄▄▄▄"
  16827. " ▌settime▐   Pone la hora del sistema."
  16828. " ▀▀▀▀▀▀▀▀▀"
  16829. " ▄▄▄▄▄▄▄▄▄"
  16830. " ▌setvect▐   Pone entrada de un vector de interrupción."
  16831. " ▀▀▀▀▀▀▀▀▀"
  16832. " ▄▄▄▄▄▄▄▄▄▄▄"
  16833. " ▌setverify▐   Pone el estado de verificación."
  16834. " ▀▀▀▀▀▀▀▀▀▀▀"
  16835. " ▄▄▄▄▄▄▄"
  16836. " ▌sleep▐   Suspende la ejecución durante un intervalo (en segundos)."
  16837. " ▀▀▀▀▀▀▀"
  16838. " ▄▄▄▄▄▄▄"
  16839. " ▌sound▐   Activa el altavoz del PC a una frecuencia especificada."
  16840. " ▀▀▀▀▀▀▀"
  16841. " ▄▄▄▄▄▄▄▄▄▄▄"
  16842. " ▌unixtodos▐   Convierte fecha y hora de formato UNIX a formato DOS."
  16843. " ▀▀▀▀▀▀▀▀▀▀▀"
  16844. " ▄▄▄▄▄▄▄▄"
  16845. " ▌unlink▐   Borra un fichero."
  16846. " ▀▀▀▀▀▀▀▀"
  16847. ""
  16848. "FUNCIONES:"
  16849. "**********"
  16850. ""
  16851. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  16852. " ▌absread  y  abswrite▐   absread() lee sectores absolutos de disco."
  16853. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   abswrite() escribe sectores absolutos de disco."
  16854. ""
  16855. " Sintaxis:"
  16856. "   int absread (int drive, int nsects, long lsect, void *buffer);"
  16857. "   int abswrite (int drive, int nsects, long lsect, void *buffer);"
  16858. ""
  16859. ""
  16860. " ■ drive   es 0 = A, 1 = B, 2 = C, etc."
  16861. " ■ nsects  es el número de sectores a leer/escribir"
  16862. " ■ lsect   es el sector lógico de comienzo (0 es el primero)"
  16863. " ■ buffer  es la dirección del área de datos"
  16864. ""
  16865. "64K es la cantidad de memoria más grande por llamada que puede ser leída o"
  16866. "escrita."
  16867. ""
  16868. "Devuelve 0 si tiene éxito; en caso de error, devuelve -1 y pone en errno"
  16869. "el número de error."
  16870. ""
  16871. ""
  16872. " ▄▄▄▄▄▄▄▄▄▄"
  16873. " ▌allocmem▐   Asigna memoria."
  16874. " ▀▀▀▀▀▀▀▀▀▀"
  16875. ""
  16876. " Sintaxis:"
  16877. "   int allocmem (unsigned tam, unsigned *pseg);"
  16878. ""
  16879. "tam es el número de párrafos a asignar (un párrafo son 16 bytes). La direc-"
  16880. "ción del segmento del área asignada es almacenada en *pseg; el offset = 0."
  16881. ""
  16882. "Devuelve -1 si tiene éxito. En otro caso devuelve el tamaño del bloque"
  16883. "disponible más grande, y pone en _doserrno y errno el código de error."
  16884. ""
  16885. "Ejemplo:"
  16886. ""
  16887. "  #include <dos.h>"
  16888. "  #include <alloc.h>"
  16889. "  #include <stdio.h>"
  16890. ""
  16891. "  int main (void)"
  16892. "  {"
  16893. "    unsigned int tam, pseg;"
  16894. "    int estado;"
  16895. ""
  16896. "    tam = 64; /* (64 x 16) = 1024 bytes */"
  16897. "    estado = allocmem (tam, &pseg);"
  16898. "    if (estado == -1)"
  16899. "      printf ("Memoria asignada en segmeto: %X\n", pseg);"
  16900. "    else"
  16901. "      printf ("Asignación fallida: el número máximo de párrafos disponibles""
  16902. "              " es %u\n", estado);"
  16903. ""
  16904. "    return 0;"
  16905. "  }"
  16906. ""
  16907. ""
  16908. " ▄▄▄▄▄▄"
  16909. " ▌bdos▐   Invoca una función del DOS, forma corta."
  16910. " ▀▀▀▀▀▀"
  16911. ""
  16912. " Sintaxis:"
  16913. "   int bdos (int dosfun, unsigned dosdx, unsigned dosal);"
  16914. ""
  16915. "El valor devuelto de bdos() es el valor que pone en AX la llamada del"
  16916. "sistema."
  16917. ""
  16918. "Ejemplo:"
  16919. ""
  16920. "  #include <stdio.h>"
  16921. "  #include <dos.h>"
  16922. ""
  16923. "  /* Obtiene unidad actual como 'A', 'B', ... */"
  16924. "  char unidad_actual (void)"
  16925. "  {"
  16926. "    char unidadact;"
  16927. ""
  16928. "    /* Obtiene disco actual como 0, 1, ... */"
  16929. "    unidadact = bdos (0x19, 0, 0);"
  16930. "    return ('A' + unidadact);"
  16931. "  }"
  16932. ""
  16933. "  int main (void)"
  16934. "  {"
  16935. "    printf ("La unidad actual es %c:\n", unidad_actual ());"
  16936. "    return 0;"
  16937. "  }"
  16938. ""
  16939. ""
  16940. " ▄▄▄▄▄▄▄▄▄"
  16941. " ▌bdosptr▐   LLamada al sistema MS-DOS."
  16942. " ▀▀▀▀▀▀▀▀▀"
  16943. ""
  16944. " Sintaxis:"
  16945. "   int bdosptr (int dosfun, void *argument, unsigned dosal);"
  16946. ""
  16947. "El valor devuelto por bdosptr() es el valor de AX si tiene éxito, o -1 si"
  16948. "falla. En caso de fallo, se pone errno y _doserrno con el código de error."
  16949. ""
  16950. ""
  16951. " ▄▄▄▄▄▄▄▄▄"
  16952. " ▌country▐   Devuelve información dependiente del país."
  16953. " ▀▀▀▀▀▀▀▀▀"
  16954. ""
  16955. " Sintaxis:"
  16956. "   struct COUNTRY *country (int xcode, struct COUNTRY *pc);"
  16957. ""
  16958. "Devuelve el puntero pc."
  16959. ""
  16960. "Ejemplo:"
  16961. ""
  16962. "  #include <stdio.h>"
  16963. "  #include <dos.h>"
  16964. ""
  16965. "  #define USA 0"
  16966. ""
  16967. "  void main (void)"
  16968. "  {"
  16969. "    struct COUNTRY pc;"
  16970. ""
  16971. "    country (USA, &pc);"
  16972. ""
  16973. "    printf ("\nco_date: %d", pc.co_date);"
  16974. "    printf ("\nco_curr: %s", pc.co_curr);"
  16975. "    printf ("\nco_thsep: %s", pc.co_thsep);"
  16976. "    printf ("\nco_desep: %s", pc.co_desep);"
  16977. "    printf ("\nco_dtsep: %s", pc.co_dtsep);"
  16978. "    printf ("\nco_tmsep: %s", pc.co_tmsep);"
  16979. "  }"
  16980. ""
  16981. ""
  16982. " ▄▄▄▄▄▄▄▄▄"
  16983. " ▌ctrlbrk▐   Pone manejador de control-break."
  16984. " ▀▀▀▀▀▀▀▀▀"
  16985. ""
  16986. " Sintaxis:"
  16987. "   void ctrlbrk (int (*manejador) (void));"
  16988. ""
  16989. "La función manejador devuelve 0 para abortar el programa actual; en otro"
  16990. "caso el programa continuará la ejecución."
  16991. ""
  16992. "Ejemplo:"
  16993. ""
  16994. "  #include <stdio.h>"
  16995. "  #include <dos.h>"
  16996. ""
  16997. "  #define ABORT 0"
  16998. ""
  16999. "  int c_break (void)"
  17000. "  {"
  17001. "    printf ("Control-Break presionado.  Abortando programa ...\n");"
  17002. "    return (ABORT);"
  17003. "  }"
  17004. ""
  17005. "  void main (void)"
  17006. "  {"
  17007. "    ctrlbrk (c_break);"
  17008. "    for (;;)"
  17009. "      {"
  17010. "        printf ("Bucle... Presiona <Ctrl-Break> para salir:\n");"
  17011. "      }"
  17012. "  }"
  17013. ""
  17014. ""
  17015. " ▄▄▄▄▄▄▄"
  17016. " ▌delay▐   Suspende la ejecución durante un intervalo (en milisegundos)."
  17017. " ▀▀▀▀▀▀▀"
  17018. ""
  17019. " Sintaxis:"
  17020. "   void delay (unsigned milisegundos);"
  17021. ""
  17022. ""
  17023. " ▄▄▄▄▄▄▄▄▄"
  17024. " ▌disable▐   Inhabilita las interrupciones."
  17025. " ▀▀▀▀▀▀▀▀▀"
  17026. ""
  17027. " Sintaxis:"
  17028. "   void disable (void);"
  17029. ""
  17030. "Inhabilita todas las interrupciones hardware excepto NMI."
  17031. ""
  17032. ""
  17033. " ▄▄▄▄▄▄▄▄▄▄▄"
  17034. " ▌dosexterr▐   Obtiene información de error extendido del DOS."
  17035. " ▀▀▀▀▀▀▀▀▀▀▀"
  17036. ""
  17037. " Sintaxis:"
  17038. "   int dosexterr (struct DOSERROR *eblkp);"
  17039. ""
  17040. "Rellena los campos de *eblkp basados en la última llamada al DOS. Devuelve"
  17041. "el valor del campo de_exterror de la estructura."
  17042. ""
  17043. ""
  17044. " ▄▄▄▄▄▄▄▄▄▄▄"
  17045. " ▌dostounix▐   Convierte fecha y hora a formato de hora UNIX."
  17046. " ▀▀▀▀▀▀▀▀▀▀▀"
  17047. ""
  17048. " Sintaxis:"
  17049. "   long dostounix (struct date *d, struct time *t);"
  17050. ""
  17051. "Devuelve la versión de UNIX de la hora actual: número de segundos desde el"
  17052. "1 de Enero de 1970 (GMT)."
  17053. ""
  17054. ""
  17055. " ▄▄▄▄▄▄▄▄▄▄"
  17056. " ▌__emit__▐   Inserta valores literales directamente dentro del código."
  17057. " ▀▀▀▀▀▀▀▀▀▀"
  17058. ""
  17059. " Sintaxis:"
  17060. "   void __emit__ (argument, ...);"
  17061. ""
  17062. "Ejemplo:"
  17063. ""
  17064. "  #include <dos.h>"
  17065. ""
  17066. "  int main (void)"
  17067. "  {"
  17068. "    /*"
  17069. "      Emite código que generará una int 5 (imprimir pantalla)"
  17070. "    */"
  17071. "    __emit__ (0xcd,0x05);"
  17072. "    return 0;"
  17073. "  }"
  17074. ""
  17075. ""
  17076. " ▄▄▄▄▄▄▄▄"
  17077. " ▌enable▐   Habilita las interrupciones hardware."
  17078. " ▀▀▀▀▀▀▀▀"
  17079. " Sintaxis:"
  17080. "   void enable (void);"
  17081. ""
  17082. "Ejemplo:"
  17083. ""
  17084. "  /* NOTA: Cuando se utilizan rutinas de servicio de interrupción,"
  17085. "     no se puede compilar el programa con la opción de testear el"
  17086. "     desbordamiento de pila puesta a on y obtener un programa eje-"
  17087. "     cutable que opere correctamente */"
  17088. ""
  17089. "  #include <stdio.h>"
  17090. "  #include <dos.h>"
  17091. "  #include <conio.h>"
  17092. ""
  17093. "  #define INTR 0X1C  /* interrupción de pulso de reloj */"
  17094. ""
  17095. "  void interrupt (*viejo_manejador) (void);"
  17096. ""
  17097. "  int cont = 0;"
  17098. ""
  17099. "  void interrupt manejador (void)"
  17100. "  {"
  17101. "    /* inhabilita las interrupciones mientras se maneja la interrupción */"
  17102. "    disable ();"
  17103. "    /* incrementa el contador global */"
  17104. "    cont++;"
  17105. "    /* vuelve a habilitar las interrupciones al final del manejador */"
  17106. "    enable ();"
  17107. "    /* llama a la rutina original */"
  17108. "    viejo_manejador ();"
  17109. "  }"
  17110. ""
  17111. "  int main (void)"
  17112. "  {"
  17113. "    /* salva el vector de interrupción original */"
  17114. "    viejo_manejador = getvect (INTR);"
  17115. ""
  17116. "    /* instala el nuevo manejador de interrupción */"
  17117. "    setvect (INTR, manejador);"
  17118. ""
  17119. "    /* bucle hasta mientras el contador no exceda de 20 */"
  17120. "    while (cont < 20)"
  17121. "      printf ("cont es %d\n", cont);"
  17122. ""
  17123. "    /* vuelve a poner el manejador de interrupción original */"
  17124. "    setvect (INTR, viejo_manejador);"
  17125. ""
  17126. "    return 0;"
  17127. "  }"
  17128. ""
  17129. ""
  17130. "▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄■Obtiene el offset de una direc. far (FP_OFF)"
  17131. "▌macros FP_OFF, FP_SEG y MK_FP▐■Obtiene el segmento de una direc. far(FP_SEG)"
  17132. "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀■Hace un puntero far (MK_FP)."
  17133. ""
  17134. "Sintaxis:"
  17135. "  unsigned FP_OFF (void far *p);"
  17136. "  unsigned FP_SEG (void far *p);"
  17137. "  void far *MK_FP (unsigned seg, unsigned ofs);"
  17138. ""
  17139. ""
  17140. " ▄▄▄▄▄▄▄▄▄"
  17141. " ▌freemem▐   Libera un bloque de momoria del DOS asignado previamente con"
  17142. " ▀▀▀▀▀▀▀▀▀   allocmen()."
  17143. ""
  17144. " Sintaxis:"
  17145. "   int freemem (unsigned segx);"
  17146. ""
  17147. "Devuelve 0 si tiene éxito; -1 en caso de error y se pone en errno el código"
  17148. "de error."
  17149. ""
  17150. ""
  17151. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  17152. " ▌geninterrupt▐   Macro que genera una interrupción software."
  17153. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  17154. ""
  17155. " Sintaxis:"
  17156. "   void geninterrupt (int num_interrup);"
  17157. ""
  17158. "El estado de todos los registros después de la llamada es dependiente de"
  17159. "la interrupción llamada. Cuidado: las interrupciones pueden dejar regis-"
  17160. "tros usados por Turbo C en un estado impredecible."
  17161. ""
  17162. ""
  17163. " ▄▄▄▄▄▄▄▄▄"
  17164. " ▌getcbrk▐   Obtiene el estado de control-break."
  17165. " ▀▀▀▀▀▀▀▀▀"
  17166. ""
  17167. " Sintaxis:"
  17168. "   int getcbrk (void);"
  17169. ""
  17170. "Devuelve 0 si el chequeo de control-break está off y 1 si el chequeo"
  17171. "está on."
  17172. ""
  17173. "Ejemplo:"
  17174. ""
  17175. "  #include <stdio.h>"
  17176. "  #include <dos.h>"
  17177. ""
  17178. "  int main (void)"
  17179. "  {"
  17180. "    if (getcbrk ())"
  17181. "      printf ("Cntrl-brk está on\n");"
  17182. "    else"
  17183. "      printf ("Cntrl-brk está off\n");"
  17184. ""
  17185. "    return 0;"
  17186. "  }"
  17187. ""
  17188. ""
  17189. " ▄▄▄▄▄▄▄▄▄"
  17190. " ▌getdate▐   Obtiene fecha del sistema (DOS)."
  17191. " ▀▀▀▀▀▀▀▀▀"
  17192. ""
  17193. " Sintaxis:"
  17194. "   void getdate (struct date *pfecha);"
  17195. ""
  17196. "Ejemplo:"
  17197. ""
  17198. "  #include <dos.h>"
  17199. "  #include <stdio.h>"
  17200. ""
  17201. "  int main (void)"
  17202. "  {"
  17203. "    struct date d;"
  17204. ""
  17205. "    getdate (&d);"
  17206. "    printf ("El día actual es: %d\n", d.da_day);"
  17207. "    printf ("El mes actual es: %d\n", d.da_mon);"
  17208. "    printf ("El año actual es es: %d\n", d.da_year);"
  17209. "    return 0;"
  17210. "  }"
  17211. ""
  17212. ""
  17213. " ▄▄▄▄▄▄▄▄▄▄"
  17214. " ▌getdfree▐   Obtiene el espacio libre de disco."
  17215. " ▀▀▀▀▀▀▀▀▀▀"
  17216. ""
  17217. " Sintaxis:"
  17218. "   void getdfree (unsigned char drive, struct dfree *dtable);"
  17219. ""
  17220. "En caso de error, a df_sclus en la estructura dfree se la da el valor de"
  17221. "0xFFFF."
  17222. ""
  17223. ""
  17224. "  #include <stdio.h>"
  17225. "  #include <stdlib.h>"
  17226. "  #include <dir.h>"
  17227. "  #include <dos.h>"
  17228. ""
  17229. "  int main (void)"
  17230. "  {"
  17231. "    struct dfree free;"
  17232. "    long disponible;"
  17233. "    int drive;"
  17234. ""
  17235. "    drive = getdisk ();"
  17236. "    getdfree (drive+1, &free);"
  17237. "    if (free.df_sclus == 0xFFFF)"
  17238. "      {"
  17239. "        printf ("Error en la llamada a getdfree()\n");"
  17240. "        exit (1);"
  17241. "      }"
  17242. ""
  17243. "     disponible = (long) free.df_avail * (long) free.df_bsec *"
  17244. "                  (long) free.df_sclus;"
  17245. "     printf ("El drive %c tiene %ld bytes disponibles\n", 'A' + drive,"
  17246. "             disponible);"
  17247. ""
  17248. "     return 0;"
  17249. "  }"
  17250. ""
  17251. ""
  17252. " ▄▄▄▄▄▄▄▄"
  17253. " ▌getdta▐   Obtiene la dirección de transferenciad de disco."
  17254. " ▀▀▀▀▀▀▀▀"
  17255. ""
  17256. " Sintaxis:"
  17257. "   char far *getdta (void);"
  17258. ""
  17259. "Devuelve un puntero a la dirección de transferencia de disco actual."
  17260. ""
  17261. "Ejemplo:"
  17262. ""
  17263. "  #include <dos.h>"
  17264. "  #include <stdio.h>"
  17265. ""
  17266. "  int main (void)"
  17267. "  {"
  17268. "    char far *dta;"
  17269. ""
  17270. "    dta = getdta ();"
  17271. "    printf ("La dirección de transferencia del disco actual es: %Fp\n", dta);"
  17272. "    return 0;"
  17273. "  }"
  17274. ""
  17275. ""
  17276. " ▄▄▄▄▄▄▄▄"
  17277. " ▌getfat▐   Obtiene información sobre la tabla de asignación de ficheros"
  17278. " ▀▀▀▀▀▀▀▀   para la unidad dada."
  17279. ""
  17280. " Sintaxis:"
  17281. "   void getfat (unsigned char drive, struct fatinfo *dtable);"
  17282. ""
  17283. ""
  17284. " ▄▄▄▄▄▄▄▄▄"
  17285. " ▌getfatd▐   Obtiene información sobre la tabla de asignación de fichero."
  17286. " ▀▀▀▀▀▀▀▀▀"
  17287. ""
  17288. " Sintaxis:"
  17289. "   void getfatd (struct fatinfo *dtable);"
  17290. ""
  17291. ""
  17292. " ▄▄▄▄▄▄▄▄▄▄"
  17293. " ▌getftime▐   Obtiene la fecha y hora de un fichero."
  17294. " ▀▀▀▀▀▀▀▀▀▀"
  17295. ""
  17296. " Sintaxis:"
  17297. "   int getftime (int descriptor, struct ftime *pftime);"
  17298. ""
  17299. "Devuelve 0 en caso de éxito, y -1 en caso de error y se pone en errno el"
  17300. "código de error."
  17301. ""
  17302. ""
  17303. " ▄▄▄▄▄▄▄▄"
  17304. " ▌getpsp▐   Obtiene el prefijo de segmento de programa."
  17305. " ▀▀▀▀▀▀▀▀"
  17306. ""
  17307. " Sintaxis:"
  17308. "   unsigned getpsp (void);"
  17309. ""
  17310. " getpsp() sólo puede ser llamada usando DOS 3.0 o superior."
  17311. ""
  17312. ""
  17313. " ▄▄▄▄▄▄▄▄▄"
  17314. " ▌gettime▐   Obtiene la hora del sistema."
  17315. " ▀▀▀▀▀▀▀▀▀"
  17316. ""
  17317. " Sintaxis:"
  17318. "   void gettime (struct time *phora);"
  17319. ""
  17320. "Ejemplo:"
  17321. ""
  17322. "  #include   <stdio.h>"
  17323. "  #include   <dos.h>"
  17324. ""
  17325. "  int main (void)"
  17326. "  {"
  17327. "    struct  time t;"
  17328. ""
  17329. "    gettime (&t);"
  17330. "    printf ("La hora actual es: %2d:%02d:%02d.%02d\n","
  17331. "            t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund);"
  17332. "    return 0;"
  17333. "  }"
  17334. ""
  17335. ""
  17336. " ▄▄▄▄▄▄▄▄▄"
  17337. " ▌getvect▐   Obtiene un vector de interrupción."
  17338. " ▀▀▀▀▀▀▀▀▀"
  17339. ""
  17340. " Sintaxis:"
  17341. "   void interrupt (*getvect (int num_interrupcion)) ();"
  17342. ""
  17343. "Devuelve el valor de 4 bytes almacenado en el vector de interrupción"
  17344. "nombrado por num_interrupcion."
  17345. ""
  17346. ""
  17347. " ▄▄▄▄▄▄▄▄▄▄▄"
  17348. " ▌getverify▐   Obtiene el estado de verificacion."
  17349. " ▀▀▀▀▀▀▀▀▀▀▀"
  17350. ""
  17351. " Sintaxis:"
  17352. "   int getverify (void);"
  17353. ""
  17354. "Devuelve 0 si el estado de verificación está off, y 1 si el estado de"
  17355. "verificación está on."
  17356. ""
  17357. "Ejemplo:"
  17358. ""
  17359. "  #include <stdio.h>"
  17360. "  #include <dos.h>"
  17361. ""
  17362. "  int main (void)"
  17363. "  {"
  17364. "    if (getverify ())"
  17365. "      printf ("El estado de verificacion del DOS está on\n");"
  17366. "    else"
  17367. "      printf ("El estado de verificación del DOS está off\n");"
  17368. "    return 0;"
  17369. "  }"
  17370. ""
  17371. ""
  17372. " ▄▄▄▄▄▄▄▄▄"
  17373. " ▌harderr▐   Establece un manejador de error hardware."
  17374. " ▀▀▀▀▀▀▀▀▀"
  17375. ""
  17376. " Sintaxis:"
  17377. "   void harderr (int (*manejador) ());"
  17378. ""
  17379. "La función apuntada por manejador será llamada cuando el DOS encuentre un"
  17380. "error crítico (INT 0x24)."
  17381. ""
  17382. "Ejemplo:"
  17383. ""
  17384. "  /*"
  17385. "    Este programa atrapa los errores de disco y pregunta al usuario la"
  17386. "    acción a realizar. Intenta ejecutarlo con ningún disco en la unidad A:"
  17387. "    para invocar sus funciones."
  17388. "  */"
  17389. ""
  17390. "  #include <stdio.h>"
  17391. "  #include <conio.h>"
  17392. "  #include <dos.h>"
  17393. ""
  17394. "  #define IGNORAR    0"
  17395. "  #define REINTENTAR 1"
  17396. "  #define ABORTAR    2"
  17397. ""
  17398. "  int buf[500];"
  17399. ""
  17400. "  /* define los mensajes de error para los problemas de disco */"
  17401. "  static char *err_msj[] ="
  17402. "    {"
  17403. "      "protección contra escritura","
  17404. "      "unidad desconocida","
  17405. "      "unidad no preparada","
  17406. "      "comando desconodido","
  17407. "      "error de datos (CRC)","
  17408. "      "respuesta mala","
  17409. "      "error de búsqueda","
  17410. "      "tipo de medio desconocido","
  17411. "      "sector no encontrado","
  17412. "      "impresora sin papel","
  17413. "      "fallo de escritura","
  17414. "      "fallo de lectura","
  17415. "      "fallo general","
  17416. "      "reservado","
  17417. "      "reservado","
  17418. "      "cambio de disco inválido""
  17419. "    };"
  17420. ""
  17421. "  int error (char *msj)"
  17422. "  {"
  17423. "    int valdev;"
  17424. ""
  17425. "    cputs (msj);"
  17426. ""
  17427. "    /* pide al usuario que presione una tecla para abortar, reintentar o"
  17428. "       ignorar */"
  17429. "    while (1)"
  17430. "      {"
  17431. "        valdev = getch ();"
  17432. "        if (valdev == 'a' || valdev == 'A')"
  17433. "          {"
  17434. "            valdev = ABORTAR;"
  17435. "            break;"
  17436. "          }"
  17437. "        if (valdev == 'r' || valdev == 'R')"
  17438. "          {"
  17439. "            valdev = REINTENTAR;"
  17440. "            break;"
  17441. "          }"
  17442. "       if (valdev == 'i' || valdev == 'I')"
  17443. "         {"
  17444. "           valdev = IGNORAR;"
  17445. "           break;"
  17446. "         }"
  17447. "     }"
  17448. ""
  17449. "    return (valdev);"
  17450. "  }"
  17451. ""
  17452. "  /* pragma warn -par reduce los warnings (avisos) que ocurren debidos al"
  17453. "     no uso de los parámetros errval, bp y si en manejador() */"
  17454. "  #pragma warn -par"
  17455. ""
  17456. "  int manejador (int errval, int ax, int bp, int si)"
  17457. "  {"
  17458. "    static char msj[80];"
  17459. "    unsigned di;"
  17460. "    int unidad;"
  17461. "    int numerror;"
  17462. ""
  17463. "    di= _DI;"
  17464. "    /*si no es un error de disco entonces fue otro problema de dispositivo*/"
  17465. "    if (ax < 0)"
  17466. "      {"
  17467. "        /* informa del error */"
  17468. "        error ("Error de dispositivo");"
  17469. "        /* y vuelve al programa directamente requiriendo abortar */"
  17470. "        hardretn (ABORTAR);"
  17471. "      }"
  17472. "    /* en otro caso fue un error de disco */"
  17473. "    unidad = ax & 0x00FF;"
  17474. "    numerror = di & 0x00FF;"
  17475. "    /* informa del error */"
  17476. "    sprintf (msj, "Error: %s en unidad %c\r\nA)bortar, R)eintentar, ""
  17477. "             "I)gnorar: ", err_msj[numerror], 'A' + unidad);"
  17478. "    /* vuelve al programa vía interrupción dos 0x23 con abortar, reintentar"
  17479. "       o ignorar según elige usuario */"
  17480. "    hardresume (error (msj));"
  17481. "    return ABORTAR;"
  17482. "  }"
  17483. "  #pragma warn +par"
  17484. ""
  17485. "  int main (void)"
  17486. "  {"
  17487. "    /* instala nuestro manejador de la interrupción de problemas hardware */"
  17488. "    harderr (manejador);"
  17489. "    clrscr ();"
  17490. "    printf ("Asegúrate que no hay ningún disco en unidad A:\n");"
  17491. "    printf ("Presiona una tecla ...\n");"
  17492. "    getch ();"
  17493. "    printf ("Intentando acceder a la unidad A:\n");"
  17494. "    printf ("fopen() devolvió %p\n", fopen ("A:temp.dat", "w"));"
  17495. "    return 0;"
  17496. "  }"
  17497. ""
  17498. " ▄▄▄▄▄▄▄▄▄▄▄▄"
  17499. " ▌hardresume▐   Función de manejador de error hardware."
  17500. " ▀▀▀▀▀▀▀▀▀▀▀▀"
  17501. ""
  17502. " Sintaxis:"
  17503. "   void hardresume (int axret);"
  17504. ""
  17505. "El manejador de error establecido por harderr() puede devolver el control"
  17506. "de la ejecución a la rutina del COS que provocó el error crítico vía esta"
  17507. "función. El valor en axret es devuelto al DOS."
  17508. ""
  17509. "    Valor"
  17510. "  devuelto   Significado"
  17511. " ═════════════════════════"
  17512. "     0        ignorar"
  17513. "     1        reintentar"
  17514. "     2        abortar"
  17515. ""
  17516. "Ver ejemplo en la función harderr()."
  17517. ""
  17518. ""
  17519. " ▄▄▄▄▄▄▄▄▄▄"
  17520. " ▌hardretn▐   Manejador de error hardware."
  17521. " ▀▀▀▀▀▀▀▀▀▀"
  17522. ""
  17523. " Sintaxis:"
  17524. "   void hardretn (int retn);"
  17525. ""
  17526. "El manejador de error establecido por harderr puede volver directamente al"
  17527. "programa de aplicación llamando a hardretn()."
  17528. ""
  17529. "El valor en retn es devuelto al programa de usuario en lugar del valor"
  17530. "normal devuelto de la función DOS que generó el error crítico."
  17531. ""
  17532. "Ver ejemplo de función harderr()."
  17533. ""
  17534. ""
  17535. " ▄▄▄▄▄"
  17536. " ▌inp▐   Macro que lee un byte de un puerto hardware."
  17537. " ▀▀▀▀▀"
  17538. ""
  17539. " Sintaxis:"
  17540. "   int inp (int portid);"
  17541. ""
  17542. ""
  17543. " ▄▄▄▄▄▄▄▄▄"
  17544. " ▌inportb▐   Lee un byte de un puerto hardware."
  17545. " ▀▀▀▀▀▀▀▀▀"
  17546. ""
  17547. " Sintaxis:"
  17548. "   unsigned char inportb (int portid);"
  17549. ""
  17550. ""
  17551. " ▄▄▄▄▄▄▄"
  17552. " ▌int86▐   Interrupción de software 8086."
  17553. " ▀▀▀▀▀▀▀"
  17554. ""
  17555. " Sintaxis:"
  17556. "   int int86 (int intno, union REGS *inregs, union REGS *outregs);"
  17557. ""
  17558. "Esta función carga los registros de la CPU con los valores almacenados en"
  17559. "inregs, ejecuta la interrupción intno, y almacena los valores resultados"
  17560. "de los registros de la CPU en outregs."
  17561. ""
  17562. "Ejemplo:"
  17563. ""
  17564. "  #include <stdio.h>"
  17565. "  #include <conio.h>"
  17566. "  #include <dos.h>"
  17567. ""
  17568. "  #define VIDEO 0x10"
  17569. ""
  17570. "  void movetoxy (int x, int y)"
  17571. "  {"
  17572. "    union REGS regs;"
  17573. ""
  17574. "    regs.h.ah = 2;  /* pone la posición del cursor */"
  17575. "    regs.h.dh = y;"
  17576. "    regs.h.dl = x;"
  17577. "    regs.h.bh = 0;  /* página de vídeo 0 */"
  17578. "    int86 (VIDEO, ®s, ®s);"
  17579. "  }"
  17580. ""
  17581. "  int main (void)"
  17582. "  {"
  17583. "    clrscr ();"
  17584. "    movetoxy (35, 10);"
  17585. "    printf ("Hola");"
  17586. "    return 0;"
  17587. "  }"
  17588. ""
  17589. ""
  17590. " ▄▄▄▄▄▄▄▄"
  17591. " ▌int86x▐   Interfase de interrupción software 8086."
  17592. " ▀▀▀▀▀▀▀▀"
  17593. ""
  17594. " Sintaxis:"
  17595. "   int int86x (int intno, union REGS *inregs, union REGS *outregs,"
  17596. "               struct SREGS *segregs);"
  17597. ""
  17598. "Esta función carga los registros de la CPU con los valores almacenados en"
  17599. "inregs y segregs, ejecuta la interrupción intno, y almacena los valores"
  17600. "resultados de los registros de la CPU en outregs y segregs."
  17601. ""
  17602. ""
  17603. " ▄▄▄▄▄▄▄▄"
  17604. " ▌intdos▐   Interfase de interrupción DOS."
  17605. " ▀▀▀▀▀▀▀▀"
  17606. ""
  17607. " Sintaxis:"
  17608. "   int intdos (union REGS *inregs, union REGS *outregs);"
  17609. ""
  17610. "Esta función carga los registros de la CPU con los valores almacenados en"
  17611. "inregs, ejecuta la interrupción DOS (int 33 o 0x21), y almacena los valores"
  17612. "resultados de los registros de la CPU en outregs."
  17613. ""
  17614. ""
  17615. " ▄▄▄▄▄▄▄▄▄"
  17616. " ▌intdosx▐   Interfase de interrupción DOS."
  17617. " ▀▀▀▀▀▀▀▀▀"
  17618. ""
  17619. " Sintaxis:"
  17620. "   int intdosx (union REGS *inregs, union REGS *outregs,"
  17621. "                struct SREGS *segregs);"
  17622. ""
  17623. "Esta función carga los registros de la CPU con los valores almacenados en"
  17624. "inregs y segregs, ejecuta la interrupción DOS (int 0x21), y almacena los"
  17625. "valores resultados de los registros de la CPU en outregs y segregs."
  17626. ""
  17627. ""
  17628. " ▄▄▄▄▄▄"
  17629. " ▌intr▐   Interfase de interrupción software 8086."
  17630. " ▀▀▀▀▀▀"
  17631. ""
  17632. " Sintaxis:"
  17633. "   void intr (int intno, struct REGPACK *preg);"
  17634. ""
  17635. "Esta función carga los registros de la CPU con los valores almacenados en"
  17636. "preg, ejecuta la interrupción intno, y almacena los valores resultados"
  17637. "de los registros de la CPU en preg."
  17638. ""
  17639. ""
  17640. " ▄▄▄▄▄▄"
  17641. " ▌keep▐   Termina y queda residente."
  17642. " ▀▀▀▀▀▀"
  17643. ""
  17644. " Sintaxis:"
  17645. "   void keep (unsigned char estado, unsigned tamanio);"
  17646. ""
  17647. "Esta función vuelve al DOS con valor de salida en estado, pero el programa"
  17648. "queda en memoria. La porción de programa residente ocupa tamanio párrafos"
  17649. "y la memoria del programa restante es liberada."
  17650. ""
  17651. ""
  17652. " ▄▄▄▄▄▄▄▄▄"
  17653. " ▌nosound▐   Desactiva el altavoz del PC."
  17654. " ▀▀▀▀▀▀▀▀▀"
  17655. ""
  17656. " Sintaxis:"
  17657. "   void nosound (void);"
  17658. ""
  17659. ""
  17660. " ▄▄▄▄▄▄"
  17661. " ▌outp▐   Macro que escribe un byte en un puerto hardware."
  17662. " ▀▀▀▀▀▀"
  17663. ""
  17664. " Sintaxis:"
  17665. "   int outp (int portid, int byte_value);"
  17666. ""
  17667. ""
  17668. " ▄▄▄▄▄▄▄▄▄"
  17669. " ▌outport▐   Escribe una palabra en un puerto hardware."
  17670. " ▀▀▀▀▀▀▀▀▀"
  17671. ""
  17672. " Sintaxis:"
  17673. "   void outport (int portid, int value);"
  17674. ""
  17675. " ▄▄▄▄▄▄▄▄▄▄"
  17676. " ▌outportb▐   Escribe un byte en un puerto hardware."
  17677. " ▀▀▀▀▀▀▀▀▀▀"
  17678. ""
  17679. " Sintaxis:"
  17680. "   void outportb (int portid, unsigned char value);"
  17681. ""
  17682. ""
  17683. " ▄▄▄▄▄▄▄▄▄"
  17684. " ▌parsfnm▐   Analiza un nombre de fichero y construye un bloque de control"
  17685. " ▀▀▀▀▀▀▀▀▀   de fichero (FCB)."
  17686. ""
  17687. " Sintaxis:"
  17688. "   char *parsfnm (const char *cmdline, struct fcb *fcb, int opt);"
  17689. ""
  17690. "Después de analizar con éxito el nombre del fichero, parsfnm() devuelve un"
  17691. "puntero al byte siguiente después del final del nombre del fichero. Si no"
  17692. "se produce ningún error en el análisis del nombre del fichero, devuelve 0."
  17693. ""
  17694. ""
  17695. " ▄▄▄▄▄▄"
  17696. " ▌peek▐   Devuelve la palabra que hay en la localización de memoria"
  17697. " ▀▀▀▀▀▀   especificada por segmento:desplazamiento."
  17698. ""
  17699. " Sintaxis:"
  17700. "   int peek (unsigned segmento, unsigned desplazamiento);"
  17701. ""
  17702. " ▄▄▄▄▄▄▄"
  17703. " ▌peekb▐   Devuelve el byte que hay en la localización de memoria"
  17704. " ▀▀▀▀▀▀▀   especificada por segmento:desplazamiento."
  17705. ""
  17706. " Sintaxis:"
  17707. "   char peekb (unsigned segmento, unsigned desplazamiento);"
  17708. ""
  17709. " ▄▄▄▄▄▄"
  17710. " ▌poke▐   Almacena un valor entero en la posición de memoria especificada"
  17711. " ▀▀▀▀▀▀   por segmento:desplazamiento."
  17712. ""
  17713. " Sintaxis:"
  17714. "   void poke(unsigned segmento, unsigned desplazamiento, int valor);"
  17715. ""
  17716. " ▄▄▄▄▄▄▄"
  17717. " ▌pokeb▐   Almacena un byte en la posición de memoria especificada"
  17718. " ▀▀▀▀▀▀▀   por segmento:desplazamiento."
  17719. ""
  17720. " Sintaxis:"
  17721. "   void pokeb (unsigned segmento, unsigned desplazamiento, char valor);"
  17722. ""
  17723. ""
  17724. " ▄▄▄▄▄▄▄▄▄"
  17725. " ▌randbrd▐   Lee bloque aleatorio."
  17726. " ▀▀▀▀▀▀▀▀▀"
  17727. ""
  17728. " Sintaxis:"
  17729. "   int randbrd (struct fcb *fcb, int rcnt);"
  17730. ""
  17731. "Si devuelve 0 todos los registros han sido leídos correctamente, si"
  17732. "devuelve otro valor ha habido algún problema."
  17733. ""
  17734. " ▄▄▄▄▄▄▄▄▄"
  17735. " ▌randbwr▐   Escribe bloque aleatorio usando el bloque de control de"
  17736. " ▀▀▀▀▀▀▀▀▀   fichero (FCB)."
  17737. ""
  17738. " Sintaxis:"
  17739. "   int randbwr (struct fcb *fcb, int rcnt);"
  17740. ""
  17741. "Si devuelve 0 todos los registros han sido escritos correctamente, si"
  17742. "devuelve otro valor ha habido algún problema."
  17743. ""
  17744. ""
  17745. " ▄▄▄▄▄▄▄▄▄"
  17746. " ▌segread▐   Lee registros del segmento."
  17747. " ▀▀▀▀▀▀▀▀▀"
  17748. ""
  17749. " Sintaxis:"
  17750. "   void segread (struct SREGS *segp);"
  17751. ""
  17752. ""
  17753. "  #include <stdio.h>"
  17754. "  #include <dos.h>"
  17755. ""
  17756. "  int main (void)"
  17757. "  {"
  17758. "    struct SREGS segs;"
  17759. ""
  17760. "    segread (&segs);"
  17761. "    printf ("Valores de los registros del segmento actual\n");"
  17762. "    printf ("CS: %X   DS: %X\n", segs.cs, segs.ds);"
  17763. "    printf ("ES: %X   SS: %X\n", segs.es, segs.ss);"
  17764. ""
  17765. "    return 0;"
  17766. "  }"
  17767. ""
  17768. ""
  17769. " ▄▄▄▄▄▄▄▄▄▄"
  17770. " ▌setblock▐   Modifica el tamaño de un bloque asignado previamente."
  17771. " ▀▀▀▀▀▀▀▀▀▀"
  17772. ""
  17773. " Sintaxis:"
  17774. "   int setblock (unsigned segx, unsigned nuevotam);"
  17775. ""
  17776. "Usa los bloques asignados con allocmem(). Devuelve -1 si tiene éxito."
  17777. ""
  17778. "En caso de error, devuelve el tamaño del bloque posible más grande y a"
  17779. "_doserrno se le asigna el código de error."
  17780. ""
  17781. ""
  17782. " ▄▄▄▄▄▄▄▄▄"
  17783. " ▌setcbrk▐   Pone el estado de control-break."
  17784. " ▀▀▀▀▀▀▀▀▀"
  17785. ""
  17786. " Sintaxis:"
  17787. "   int setcbrk (int valorcbrk);"
  17788. ""
  17789. "Si valorcbrk es 1, chequea el Ctrl-Break en cada llamada al sistema. Si es 0,"
  17790. "chequea sólo en las llamadas de E/S de consola, impresora y comunicaciones."
  17791. ""
  17792. "Devuelve el valor pasado en valorcbrk."
  17793. ""
  17794. ""
  17795. " ▄▄▄▄▄▄▄▄▄"
  17796. " ▌setdate▐   Pone la fecha del DOS."
  17797. " ▀▀▀▀▀▀▀▀▀"
  17798. ""
  17799. " Sintaxis:"
  17800. "   void setdate (struct date *pfecha);"
  17801. ""
  17802. " ▄▄▄▄▄▄▄▄"
  17803. " ▌setdta▐   Pone la dirección de transferencia de disco."
  17804. " ▀▀▀▀▀▀▀▀"
  17805. ""
  17806. " Sintaxis:"
  17807. "   void setdta (char far *dta);"
  17808. ""
  17809. " ▄▄▄▄▄▄▄▄▄"
  17810. " ▌settime▐   Pone la hora del sistema."
  17811. " ▀▀▀▀▀▀▀▀▀"
  17812. ""
  17813. " Sintaxis:"
  17814. "   void settime (struct time *phora);"
  17815. ""
  17816. " ▄▄▄▄▄▄▄▄▄"
  17817. " ▌setvect▐   Pone entrada de un vector de interrupción."
  17818. " ▀▀▀▀▀▀▀▀▀"
  17819. ""
  17820. " Sintaxis:"
  17821. "   void setvect (int interruptno, void interrupt (*isr) ( ));"
  17822. ""
  17823. "isr apunta a una función que será llamada cuando ocurra el número de"
  17824. "interrupción interrruptno. Si isr es una función C, debería ser definida"
  17825. "con la palabra clave interrupt."
  17826. ""
  17827. "Ejemplo:"
  17828. ""
  17829. "  /* NOTA: Cuando se utilizan rutinas de servicio de interrupción,"
  17830. "     no se puede compilar el programa con la opción de testear el"
  17831. "     desbordamiento de pila puesta a on y obtener un programa eje-"
  17832. "     cutable que opere correctamente */"
  17833. ""
  17834. "  #include <stdio.h>"
  17835. "  #include <dos.h>"
  17836. "  #include <conio.h>"
  17837. ""
  17838. "  #define INTR 0X1C  /* interrupción de tick de reloj */"
  17839. ""
  17840. "  void interrupt (*viejo_manejador) (void);"
  17841. ""
  17842. "  int cont = 0;"
  17843. ""
  17844. "  void interrupt manejador (void)"
  17845. "  {"
  17846. "    /* incrementa el contador global */"
  17847. "    cont++;"
  17848. ""
  17849. "    /* llama a la rutina original */"
  17850. "    viejo_manejador ();"
  17851. "  }"
  17852. ""
  17853. "  int main (void)"
  17854. "  {"
  17855. "    /* salva el vector de interrupción original */"
  17856. "    viejo_manejador = getvect (INTR);"
  17857. ""
  17858. "    /* instala el nuevo manejador de interrupción */"
  17859. "    setvect (INTR, manejador);"
  17860. ""
  17861. "    /* bucle hasta mientras el contador no exceda de 20 */"
  17862. "    while (cont < 20)"
  17863. "      printf ("cont es %d\n", cont);"
  17864. ""
  17865. "    /* vuelve a poner el manejador de interrupción original */"
  17866. "    setvect (INTR, viejo_manejador);"
  17867. ""
  17868. "    return 0;"
  17869. "  }"
  17870. ""
  17871. ""
  17872. " ▄▄▄▄▄▄▄▄▄▄▄"
  17873. " ▌setverify▐   Pone el estado de verificación."
  17874. " ▀▀▀▀▀▀▀▀▀▀▀"
  17875. ""
  17876. " Sintaxis:"
  17877. "   void setverify (int valor);"
  17878. ""
  17879. "Si valor=1, cada operación de escritura en disco será seguida por una"
  17880. "operación de lectura para asegurar resultados correctos. (0 significa"
  17881. "no lectura de comprobación.)"
  17882. ""
  17883. ""
  17884. " ▄▄▄▄▄▄▄"
  17885. " ▌sleep▐   Suspende la ejecución durante un intervalo (en segundos)."
  17886. " ▀▀▀▀▀▀▀"
  17887. ""
  17888. " Sintaxis:"
  17889. "   void sleep (unsigned segundos);"
  17890. ""
  17891. "Ejemplo:"
  17892. ""
  17893. "  #include <dos.h>"
  17894. "  #include <stdio.h>"
  17895. ""
  17896. "  int main (void)"
  17897. "  {"
  17898. "     int i;"
  17899. ""
  17900. "     for (i = 1; i < 5; i++)"
  17901. "       {"
  17902. "         printf ("Ejecución suspendida durante %d segundos.\n", i);"
  17903. "         sleep (i);"
  17904. "       }"
  17905. "     return 0;"
  17906. "  }"
  17907. ""
  17908. ""
  17909. " ▄▄▄▄▄▄▄"
  17910. " ▌sound▐   Activa el altavoz del PC a una frecuencia especificada."
  17911. " ▀▀▀▀▀▀▀"
  17912. ""
  17913. " Sintaxis:"
  17914. "   void sound (unsigned frequencia);"
  17915. ""
  17916. "frecuencia está en herzios (ciclos por segundo)"
  17917. ""
  17918. ""
  17919. " ▄▄▄▄▄▄▄▄▄▄▄"
  17920. " ▌unixtodos▐   Convierte fecha y hora de formato UNIX a formato DOS."
  17921. " ▀▀▀▀▀▀▀▀▀▀▀"
  17922. ""
  17923. " Sintaxis:"
  17924. "   void unixtodos (long time, struct date *d, struct time *t);"
  17925. ""
  17926. ""
  17927. " ▄▄▄▄▄▄▄▄"
  17928. " ▌unlink▐   Borra un fichero."
  17929. " ▀▀▀▀▀▀▀▀"
  17930. ""
  17931. " Sintaxis:"
  17932. "   int unlink (const char *nombre_de_fichero);"
  17933. ""
  17934. "Si el fichero nombre_de_fichero tiene el atributo de sólo lectura, unlink()"
  17935. "fallará. En este caso es necesario llamar primero a chmod() para cambiar el"
  17936. "atributo del fichero."
  17937. ""
  17938. "Devuelve 0 si tiene éxito; -1 en caso de error."
  17939. ""
  17940. "El prototipo de esta función también se encuentra en los ficheros io.h y"
  17941. "stdio.h"
  17942. ""
  17943. ""
  17944. "CONSTANTES, TIPOS DE DATOS, Y VARIABLES GLOBALES:"
  17945. "*************************************************"
  17946. ""
  17947. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  17948. "  int _8087 (variable global)"
  17949. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  17950. ""
  17951. "Chip de coprocesador actual."
  17952. ""
  17953. "Si el programa está ejecutándose en una máquina con coprocesador matemático,"
  17954. "_8087 es distinto de cero:"
  17955. ""
  17956. "  valor │ Coprocesador"
  17957. "  _8087 │ matemático"
  17958. " ═══════╪════════════════"
  17959. "    1   │ 8087"
  17960. "    2   │ 80287"
  17961. "    3   │ 80387"
  17962. " ───────┼────────────────"
  17963. "    0   │ (no detectado)"
  17964. ""
  17965. ""
  17966. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  17967. "  _argc (variable global)"
  17968. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  17969. ""
  17970. "Contiene el número de argumentos en la línea de comandos."
  17971. ""
  17972. "  extern int _argc;"
  17973. ""
  17974. "_argc tiene el valor de argc pasado a main cuando empieza el programa."
  17975. ""
  17976. ""
  17977. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  17978. "  _argv (variable global)"
  17979. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  17980. ""
  17981. "Array de punteros a los argumentos de la línea de comandos."
  17982. ""
  17983. "  extern char *_argv[]"
  17984. ""
  17985. ""
  17986. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  17987. "  BYTEREGS (struct)"
  17988. "  WORDREGS (struct)"
  17989. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  17990. ""
  17991. "Estructuras para almacenamientos de registros de bytes y palabras."
  17992. ""
  17993. "  struct  BYTEREGS"
  17994. "    {"
  17995. "      unsigned char  al, ah, bl, bh;"
  17996. "      unsigned char  cl, ch, dl, dh;"
  17997. "    };"
  17998. ""
  17999. "  struct  WORDREGS"
  18000. "    {"
  18001. "      unsigned int  ax, bx, cx, dx;"
  18002. "      unsigned int  si, di, cflag, flags;"
  18003. "    };"
  18004. ""
  18005. ""
  18006. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  18007. "  COUNTRY (struct)"
  18008. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  18009. ""
  18010. "La estructura COUNTRY especifica cómo se van a formatear ciertos datos"
  18011. "dependientes del país."
  18012. ""
  18013. "  struct COUNTRY"
  18014. "    {"
  18015. "      int   co_date; /* formato de fecha */"
  18016. "      char  co_curr[5]; /* símbolo de moneda */"
  18017. "      char  co_thsep[2]; /* separador de millar */"
  18018. "      char  co_desep[2]; /* separador decimal */"
  18019. "      char  co_dtsep[2]; /* separador de fecha */"
  18020. "      char  co_tmsep[2]; /* separador de tiempo */"
  18021. "      char  co_currstyle; /* estilo de moneda */"
  18022. "      char  co_digits; /* dígitos significativos en moneda */"
  18023. "      char  co_time;"
  18024. "      long  co_case;"
  18025. "      char  co_dasep[2]; /* separador de datos */"
  18026. "      char  co_fill[10];"
  18027. "   };"
  18028. ""
  18029. ""
  18030. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  18031. "  DATE (struct)"
  18032. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  18033. ""
  18034. "Estructura de la fecha usada por las funciones dostounix(), setdate(),"
  18035. "getdate() y unixtodos()."
  18036. ""
  18037. "  struct date"
  18038. "    {"
  18039. "      int   da_year;"
  18040. "      char  da_day;"
  18041. "      char  da_mon;"
  18042. "    };"
  18043. ""
  18044. ""
  18045. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  18046. "  DEVHDR (struct)"
  18047. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  18048. ""
  18049. "Estructura de cabecera para los controladores de dispositivos de MS-DOS."
  18050. ""
  18051. "  struct devhdr"
  18052. "    {"
  18053. "      long            dh_next;"
  18054. "      short           dh_attr;"
  18055. "      unsigned short  dh_strat;"
  18056. "      unsigned short  dh_inter;"
  18057. "      char            dh_name[8];"
  18058. "    };"
  18059. ""
  18060. ""
  18061. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  18062. "  DFREE (struct)"
  18063. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  18064. ""
  18065. "La estructura de la información devuelta por la función getdfree()."
  18066. ""
  18067. "  struct dfree"
  18068. "    {"
  18069. "      unsigned df_avail; /* Clusters disponibles */"
  18070. "      unsigned df_total; /* Clusters totales */"
  18071. "      unsigned df_bsec;  /* Bytes por sector */"
  18072. "      unsigned df_sclus; /* Sectores por cluster */"
  18073. "    };"
  18074. ""
  18075. ""
  18076. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  18077. "  _doserrno (variable global)"
  18078. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  18079. ""
  18080. "Variable que contiene el código de error de DOS actual."
  18081. ""
  18082. "  int _doserrno;"
  18083. ""
  18084. "Cuando en una llamada al sistema MS-DOS ocurre un error, a _doserrno se"
  18085. "le asigna el código de error DOS actual."
  18086. ""
  18087. "Los mnemotécnicos para los códigos de error de DOS actual que pueden ser"
  18088. "asignados a _doserrno son:"
  18089. ""
  18090. " Mnemotécnico │ Código de error del DOS."
  18091. " ═════════════╪══════════════════════════════"
  18092. "    E2BIG     │ Entorno malo"
  18093. "    EACCES    │ Acceso denegado"
  18094. "    EACCES    │ Acceso malo"
  18095. "    EACCES    │ Es directorio corriente"
  18096. "    EBADF     │ Manejador malo"
  18097. "    EFAULT    │ Reservado"
  18098. "    EINVAL    │ Datos malos"
  18099. "    EINVAL    │ Función mala"
  18100. "    EMFILE    │ Demasiados ficheros abiertos"
  18101. "    ENOENT    │ No es fichero ni directorio"
  18102. "    ENOEXEC   │ Formato malo"
  18103. "    ENOMEM    │ MCB destruido"
  18104. "    ENOMEM    │ Fuera de memoria"
  18105. "    ENOMEM    │ Bloque malo"
  18106. "    EXDEV     │ Unidad mala"
  18107. "    EXDEV     │ No es el mismo dispositivo"
  18108. ""
  18109. "Esta variable también está declarada en los ficheros errno.h y stdlib.h."
  18110. ""
  18111. ""
  18112. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  18113. "  dosSearchInfo (tipo)"
  18114. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  18115. ""
  18116. " typedef struct"
  18117. "   {"
  18118. "     char   drive;"
  18119. "     char   pattern [13];"
  18120. "     char   reserved [7];"
  18121. "     char   attrib;"
  18122. "     short  time;"
  18123. "     short  date;"
  18124. "     long   size;"
  18125. "     char   nameZ [13];"
  18126. "   } dosSearchInfo;"
  18127. ""
  18128. ""
  18129. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  18130. "  environ (variable global)"
  18131. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  18132. ""
  18133. "Array de cadenas usado para acceder y alterar el entorno del proceso."
  18134. ""
  18135. "  extern char **environ"
  18136. ""
  18137. "También se encuentra declarada en el fichero stdlib.h."
  18138. ""
  18139. ""
  18140. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  18141. "  FATINFO (struct)"
  18142. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  18143. ""
  18144. "La estructura de información rellenada por las funciones getfat() y"
  18145. "getfatd()."
  18146. ""
  18147. "  struct fatinfo"
  18148. "    {"
  18149. "      char  fi_sclus; /* sectores por cluster */"
  18150. "      char  fi_fatid; /* el byte identificador de la FAT */"
  18151. "      int   fi_nclus; /* número de clusters */"
  18152. "      int   fi_bysec; /* bytes por sector */"
  18153. "    };"
  18154. ""
  18155. ""
  18156. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  18157. "  FCB (struct)"
  18158. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  18159. ""
  18160. "La estructura de los bloques de control de ficheros de MS-DOS."
  18161. ""
  18162. "  struct fcb"
  18163. "    {"
  18164. "      char   fcb_drive;"
  18165. "      char   fcb_name[8],  fcb_ext[3];"
  18166. "      short  fcb_curblk,   fcb_recsize;"
  18167. "      long   fcb_filsize;"
  18168. "      short  fcb_date;"
  18169. "      char   fcb_resv[10], fcb_currec;"
  18170. "      long   fcb_random;"
  18171. "    };"
  18172. ""
  18173. ""
  18174. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  18175. "  FA_xxxx (#defines)"
  18176. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  18177. ""
  18178. "Atributos de fichero de MS-DOS."
  18179. ""
  18180. "  FA_RDONLY   Atributo de sólo lectura."
  18181. "  FA_HIDDEN   Fichero oculto."
  18182. "  FA_SYSTEM   Fichero de sistema."
  18183. "  FA_LABEL    Etiqueta de la unidad."
  18184. "  FA_DIREC    Directorio."
  18185. "  FA_ARCH     Archivo."
  18186. ""
  18187. ""
  18188. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  18189. "  _heaplen (variable global)"
  18190. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  18191. ""
  18192. "Tamaño inicial del montón en bytes."
  18193. ""
  18194. "  unsigned _heaplen"
  18195. ""
  18196. "El valor de _heaplen al principio de la ejecución del programa determina"
  18197. "el tamaño del montón near que será asignado. El valor de 0, por defecto,"
  18198. "hace un montón de tamaño máximo."
  18199. ""
  18200. "_heaplen no es usado en los modelos de datos grandes."
  18201. ""
  18202. ""
  18203. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  18204. "  NFDS (#define)"
  18205. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  18206. ""
  18207. "Número máximo de descriptores de fichero."
  18208. ""
  18209. ""
  18210. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  18211. "  _osmajor (variable global)"
  18212. "  _osminor (variable global)"
  18213. "  _version (variable global)"
  18214. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  18215. ""
  18216. "La versión de MS-DOS bajo la cual está corriendo el programa actualmente."
  18217. ""
  18218. "  unsigned char _osmajor /* número de versión mayor */"
  18219. "  unsigned char _osminor /* número de versión menor */"
  18220. "  unsigned int  _version /* número de versión completa */"
  18221. ""
  18222. ""
  18223. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  18224. "  _psp (variable global)"
  18225. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  18226. ""
  18227. "Dirección del segmento del PSP (Prefijo de Segmento de Programa) del"
  18228. "programa."
  18229. ""
  18230. "  extern unsigned int _psp;"
  18231. ""
  18232. "También está declarada en los ficheros process.h y stdlib.h."
  18233. ""
  18234. ""
  18235. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  18236. "  REGPACK (struct)"
  18237. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  18238. ""
  18239. "La estructura de los valores pasados y devueltos en la función intr()."
  18240. ""
  18241. "  struct REGPACK"
  18242. "    {"
  18243. "      unsigned  r_ax, r_bx, r_cx, r_dx;"
  18244. "      unsigned  r_bp, r_si, r_di;"
  18245. "      unsigned  r_ds, r_es, r_flags;"
  18246. "    };"
  18247. ""
  18248. ""
  18249. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  18250. "  REGS (union)"
  18251. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  18252. ""
  18253. "La unión REGS es usada para pasar y recibir información en las funciones"
  18254. "intdos(), intdosx(), int86() y int86x()."
  18255. ""
  18256. "  union REGS"
  18257. "    {"
  18258. "      struct  WORDREGS  x;"
  18259. "      struct  BYTEREGS  h;"
  18260. "    };"
  18261. ""
  18262. ""
  18263. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  18264. "  SREGS (struct)"
  18265. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  18266. ""
  18267. "La estructura de los registros de segmentos pasadas y rellenadas en las"
  18268. "funciones intdosx(), int86x() y segread()."
  18269. ""
  18270. "  struct SREGS"
  18271. "    {"
  18272. "      unsigned int es;"
  18273. "      unsigned int cs;"
  18274. "      unsigned int ss;"
  18275. "      unsigned int ds;"
  18276. "    };"
  18277. ""
  18278. ""
  18279. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  18280. "  _stklen (variable global)"
  18281. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  18282. ""
  18283. "Variable con longitud de la pila."
  18284. ""
  18285. "  extern unsigned _stklen;"
  18286. ""
  18287. "_stklen especifica el tamaño de la pila. El tamaño de la pila por defecto"
  18288. "es 4K."
  18289. "_stklen es usado antes de que se llame a la función main()."
  18290. ""
  18291. "Para poner un tamaño de pila diferente, debes declarar _stklen en tu"
  18292. "fichero fuente como una variable global. (Colócala fuera de todas las"
  18293. "funciones.)"
  18294. ""
  18295. "Por ejemplo, para poner un tamaño de pila de 20000 bytes, usa la"
  18296. "siguiente declaración:"
  18297. ""
  18298. "  unsigned _stklen = 20000;"
  18299. ""
  18300. ""
  18301. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  18302. "  TIME (struct)"
  18303. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  18304. ""
  18305. "Estructura de la hora usada por las funciones dostounix(), gettime(),"
  18306. "settime() y unixtodos()."
  18307. ""
  18308. "  struct time"
  18309. "    {"
  18310. "      unsigned char ti_min;"
  18311. "      unsigned char ti_hour;"
  18312. "      unsigned char ti_hund;"
  18313. "      unsigned char ti_sec;"
  18314. "    };"
  18315. ""
  18316. ""
  18317. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  18318. "  BYTEREGS (struct)"
  18319. "  WORDREGS (struct)"
  18320. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  18321. ""
  18322. "Estructuras para el almacenamiento de registros de bytes y palabras."
  18323. ""
  18324. "  struct BYTEREGS"
  18325. "    {"
  18326. "      unsigned char  al, ah, bl, bh;"
  18327. "      unsigned char  cl, ch, dl, dh;"
  18328. "    };"
  18329. ""
  18330. "  struct WORDREGS"
  18331. "    {"
  18332. "      unsigned int  ax, bx, cx, dx;"
  18333. "      unsigned int  si, di, cflag, flags;"
  18334. "    };"
  18335. ""
  18336. ""
  18337. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  18338. "  XFCB (struct)"
  18339. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  18340. ""
  18341. "La estructura de bloque de control de fichero extendido de MS-DOS."
  18342. ""
  18343. "  struct xfcb"
  18344. "    {"
  18345. "      char         xfcb_flag;"
  18346. "      char         xfcb_resv[5];"
  18347. "      char         xfcb_attr;"
  18348. "      struct  fcb  xfcb_fcb;"
  18349. "    };"
  18350. ""
  18351. endvis
  18352. beginv
  18353. cabecera " FUNCIONES DE LA ROM BIOS "
  18354. color 15 3
  18355. centrar_coordenadas
  18356. borde 2
  18357. ""
  18358. " Cada una de las funciones declaradas en el fichero de cabecera ~<bios.h>~"
  18359. " de Turbo C representa una rutina de servicio de la ROM BIOS. Todas estas"
  18360. " funciones se pueden implementar con las funciones int86() y int86x() del"
  18361. " fichero de cabecera <dos.h>. Para conocer más detalles sobre las funcio-"
  18362. " nes del fichero bios.h tendrás que consultar un manual en el que se des- "
  18363. " criban las funciones de la ROM BIOS."
  18364. ""
  18365. endv
  18366. borrar_pantalla
  18367. beginvis
  18368. no_multiatributo
  18369. cabecera " FICHERO DE CABECERA BIOS.H (TC) "
  18370. coordenadas_completas 1 2 80 24
  18371. color 0 3
  18372. borde 2
  18373. " ▄▄▄▄▄▄▄▄▄"
  18374. " ▌bioscom▐   E/S de comunicaciones RS-232"
  18375. " ▀▀▀▀▀▀▀▀▀"
  18376. ""
  18377. " Sintaxis:"
  18378. "   int bioscom (int cmd, char byte, int puerto);"
  18379. ""
  18380. "Los valores para cmd son los siguientes:"
  18381. ""
  18382. "  ■ 0  pone los parámetros de comunicación con el valor en byte"
  18383. "  ■ 1  envía el carácter que está en byte a la línea de comunicaciones"
  18384. "  ■ 2  recibe un carácter de la línea de comunicaciones (en los 8 bits"
  18385. "       menos significativos del valor devuelto)"
  18386. "  ■ 3  devuelve el estado actual del puerto de comunicaciones"
  18387. ""
  18388. "El puerto 0 es COM1, el 1 es COM2, etc."
  18389. ""
  18390. "Los 8 bits más significativos del valor devuelto son los bits de estado."
  18391. "Los 8 bits menos significativos dependen del cmd especificado."
  18392. ""
  18393. ""
  18394. " ▄▄▄▄▄▄▄▄▄▄"
  18395. " ▌biosdisk▐   Servicios de disco de la BIOS."
  18396. " ▀▀▀▀▀▀▀▀▀▀"
  18397. ""
  18398. " Sintaxis:"
  18399. "   int biosdisk (int cmd, int unidad, int cabeza, int pista, int sector,"
  18400. "                 int nsects, void *buffer);"
  18401. ""
  18402. "Devuelve 0 si tiene éxito; en otro caso devuelve un código de error."
  18403. ""
  18404. "Para saber los valores que puede tomar cmd y el significado de cada uno"
  18405. "de ellos consulta la interrupción 13 hex. de la ROM BIOS."
  18406. ""
  18407. ""
  18408. " ▄▄▄▄▄▄▄▄▄▄▄"
  18409. " ▌biosequip▐   Chequea equipo."
  18410. " ▀▀▀▀▀▀▀▀▀▀▀"
  18411. ""
  18412. " Sintaxis:"
  18413. "   int biosequip (void);"
  18414. ""
  18415. "Devuelve los indicadores de equipo de la BIOS."
  18416. ""
  18417. ""
  18418. " ▄▄▄▄▄▄▄▄▄"
  18419. " ▌bioskey▐   Interface de teclado."
  18420. " ▀▀▀▀▀▀▀▀▀"
  18421. ""
  18422. " Sintaxis:"
  18423. "   int bioskey (int cmd);"
  18424. ""
  18425. " cmd                                  Acción"
  18426. "═════╪══════════════════════════════════════════════════════════════════════"
  18427. "  0  │ Devuelve el código de exploración de la tecla que hay en el buffer"
  18428. "     │ y la quita de él. Espera la pulsación de la tecla si el buffer"
  18429. "     │ está vacío"
  18430. "     │"
  18431. "  1  │ Devuelve el código de exploración de la tecla que hay en el buffer"
  18432. "     │ pero no la quita de él. Devuelve 0 si el buffer está vacío. Si fue"
  18433. "     │ presionada la combinación de teclas Ctrol-Break, bioskey() devuelve"
  18434. "     │ -1 (0xFFFF)."
  18435. "     │"
  18436. "  2  │ Devuelve los indicadores de estado de las teclas de cambio de la BIOS."
  18437. "     │ (teclas shift izquierda y derecha, control, alt)"
  18438. ""
  18439. ""
  18440. " ▄▄▄▄▄▄▄▄▄▄▄▄"
  18441. " ▌biosmemory▐   Devuelve el tamaño de la memoria."
  18442. " ▀▀▀▀▀▀▀▀▀▀▀▀"
  18443. ""
  18444. " Sintaxis:"
  18445. "   int biosmemory (void);"
  18446. ""
  18447. "El valor devuelto es el tamaño de la memoria en bloques de 1K."
  18448. ""
  18449. "Ejemplo:"
  18450. ""
  18451. "  #include <stdio.h>"
  18452. "  #include <bios.h>"
  18453. ""
  18454. "  void main (void)"
  18455. "  {"
  18456. "    printf("Tamaño de la memoria RAM: %d Kbytes\n", biosmemory ());"
  18457. "  }"
  18458. ""
  18459. ""
  18460. " ▄▄▄▄▄▄▄▄▄▄▄"
  18461. " ▌biosprint▐   E/S de impresora usando directamente la BIOS."
  18462. " ▀▀▀▀▀▀▀▀▀▀▀"
  18463. ""
  18464. " Sintaxis:"
  18465. "   int biosprint (int cmd, int byte, int puerto);"
  18466. ""
  18467. "Si cmd es 0, si imprime el byte."
  18468. "Si cmd es 1, se inicializa el puerto de impresora."
  18469. "Si cmd es 2, se lee el estado actual de la impresora."
  18470. ""
  18471. "Se devuelve el estado actual de la impresora para cualquier valor de cmd."
  18472. ""
  18473. " ▄▄▄▄▄▄▄▄▄▄"
  18474. " ▌biostime▐   Rutina del servicio de reloj de la BIOS."
  18475. " ▀▀▀▀▀▀▀▀▀▀"
  18476. ""
  18477. " Sintaxis:"
  18478. "   long biostime (int cmd, long nuevahora);"
  18479. ""
  18480. "Si cmd es 0, lee la hora de la BIOS."
  18481. "Si cmd es 1, pone la hora de la BIOS."
  18482. "La hora está en pulsos de reloj desde la medianoche."
  18483. "Un segundo tiene 18.2 pulsos."
  18484. ""
  18485. "Ejemplo:"
  18486. ""
  18487. "  #include <stdio.h>"
  18488. "  #include <bios.h>"
  18489. ""
  18490. "  void main (void)"
  18491. "  {"
  18492. "    printf ("El número de pulsos de reloj desde la medianoche es: %lu\n","
  18493. "            biostime (0, 0L));"
  18494. "  }"
  18495. ""
  18496. endvis
  18497. endt
  18498. end lección 11
  18499.  
  18500. ; LECCION 12
  18501. begin
  18502. beginv
  18503. borde 2
  18504. color 1 7
  18505. centrar_coordenadas
  18506. cabecera " INDICE DE LA LECCION 12 "
  18507. ""
  18508. "- Primera parte:"
  18509. ""
  18510. "  · Funciones varias (~stdlib.h~)."
  18511. "  · Funciones de fecha y hora (~time.h~)."
  18512. "  · Funciones relacionadas con información geográfica (~locale.h~)."
  18513. ""
  18514. begint
  18515. "- Segunda parte:"
  18516. ""
  18517. "  · Función y estructura de hora actual (~sys\timeb.h~)."
  18518. "  · Funciones de información de ficheros (~sys\stat.h~)."
  18519. "  · Constantes simbólicas para compatibilidad con UNIX (~values.h~)."
  18520. "  · Funciones de coma flotante (~float.h~)."
  18521. "  · Conexión de Turbo C con ensamblador (~#pragma inline~ y ~asm~)."
  18522. ""
  18523. endt
  18524. endv
  18525. borrar_pantalla
  18526. beginv
  18527. cabecera " FUNCIONES VARIAS "
  18528. color 15 3
  18529. centrar_coordenadas
  18530. borde 2
  18531. ""
  18532. "  El fichero ~<stdlib.h>~ es una especie de"
  18533. "  miscelánea de funciones, es decir, en él"
  18534. "  se encuentra declaradas una gran variedad"
  18535. "  de funciones: funciones de conversión de"
  18536. "  tipos, de ordenación, de búsqueda, de ge-"
  18537. "  neración de números pseudoaleatorios, etc.  "
  18538. ""
  18539. pulsación
  18540. "  La cabecera stdlib.h también define los"
  18541. "  tipos ~div_t~ y ~ldiv_t~ que son los valores"
  18542. "  devueltos por ~div()~ y ~ldiv()~, respecti-"
  18543. "  vamente. Además define las macros: ~ERANGE~"
  18544. "  (valor asignado a errno si se produce un"
  18545. "  error de rango), ~HUGE_VAL~ (mayor valor"
  18546. "  representable por rutinas en coma flotan-"
  18547. "  te) y ~RAND_MAX~ (máximo valor que puede"
  18548. "  ser devuelto por la función rand())."
  18549. ""
  18550. endv
  18551. borrar_pantalla
  18552. beginvis
  18553. no_multiatributo
  18554. cabecera " FICHERO DE CABECERA STDLIB.H "
  18555. coordenadas_completas 1 2 80 24
  18556. color 0 3
  18557. borde 2
  18558. "GLOSARIO:"
  18559. "*********"
  18560. ""
  18561. " ▄▄▄▄▄▄▄"
  18562. " ▌abort▐   Termina anormalmente un programa."
  18563. " ▀▀▀▀▀▀▀"
  18564. " ▄▄▄▄▄"
  18565. " ▌abs▐   Devuelve el valor absoluto de un entero."
  18566. " ▀▀▀▀▀"
  18567. " ▄▄▄▄▄▄▄▄"
  18568. " ▌atexit▐   Registra una función de terminación."
  18569. " ▀▀▀▀▀▀▀▀"
  18570. " ▄▄▄▄▄▄"
  18571. " ▌atof▐   Convierte una cadena a un punto flotante."
  18572. " ▀▀▀▀▀▀"
  18573. " ▄▄▄▄▄▄"
  18574. " ▌atoi▐   Convierte una cadena en un entero."
  18575. " ▀▀▀▀▀▀"
  18576. " ▄▄▄▄▄▄"
  18577. " ▌atol▐   Convierte un string a un long."
  18578. " ▀▀▀▀▀▀"
  18579. " ▄▄▄▄▄▄▄▄▄"
  18580. " ▌bsearch▐   Búsqueda binaria."
  18581. " ▀▀▀▀▀▀▀▀▀"
  18582. " ▄▄▄▄▄▄▄▄"
  18583. " ▌calloc▐   Asigna memoria principal."
  18584. " ▀▀▀▀▀▀▀▀"
  18585. " ▄▄▄▄▄"
  18586. " ▌div▐   Divide dos enteros."
  18587. " ▀▀▀▀▀"
  18588. begint
  18589. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  18590. " ▌ecvt  y  fcvt▐   (TC) Convierte número en coma flotante a cadena."
  18591. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  18592. endt
  18593. " ▄▄▄▄▄▄"
  18594. " ▌exit▐   Termina programa."
  18595. " ▀▀▀▀▀▀"
  18596. " ▄▄▄▄▄▄▄"
  18597. " ▌_exit▐   Termina programa."
  18598. " ▀▀▀▀▀▀▀"
  18599. begint
  18600. " ▄▄▄▄▄▄"
  18601. " ▌fcvt▐   (TC) [Ver ecvt()]"
  18602. " ▀▀▀▀▀▀"
  18603. endt
  18604. " ▄▄▄▄▄▄"
  18605. " ▌free▐   Libera bloques asignados con malloc() o calloc()."
  18606. " ▀▀▀▀▀▀"
  18607. begint
  18608. " ▄▄▄▄▄▄"
  18609. " ▌gcvt▐   (TC) Convierte un número en coma flotante a string."
  18610. " ▀▀▀▀▀▀"
  18611. endt
  18612. " ▄▄▄▄▄▄▄▄"
  18613. " ▌getenv▐   Obtiene un string del entorno."
  18614. " ▀▀▀▀▀▀▀▀"
  18615. " ▄▄▄▄▄▄"
  18616. " ▌itoa▐   Convierte un entero a una cadena."
  18617. " ▀▀▀▀▀▀"
  18618. " ▄▄▄▄▄▄"
  18619. " ▌labs▐   Calcula el valor absoluto de un long."
  18620. " ▀▀▀▀▀▀"
  18621. " ▄▄▄▄▄▄"
  18622. " ▌ldiv▐   Divide dos longs, devuelve el cociente y el resto."
  18623. " ▀▀▀▀▀▀"
  18624. begint
  18625. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  18626. " ▌lfind and lsearch▐   (TC) Ejecuta búsqueda lineal."
  18627. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  18628. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄   (TC)"
  18629. " ▌_lrotl and _lrotr▐   Rota un valor long a la izquierda (_lrotl)."
  18630. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   Rota un valor long a la derecha (_lrotr)."
  18631. " ▄▄▄▄▄▄▄▄▄"
  18632. " ▌lsearch▐   (TC) [Ver lfind()]"
  18633. " ▀▀▀▀▀▀▀▀▀"
  18634. endt
  18635. " ▄▄▄▄▄▄"
  18636. " ▌ltoa▐   Convierte un long a una cadena."
  18637. " ▀▀▀▀▀▀"
  18638. " ▄▄▄▄▄▄▄▄"
  18639. " ▌malloc▐   Asigna memoria principal."
  18640. " ▀▀▀▀▀▀▀▀"
  18641. begint
  18642. " ▄▄▄▄▄▄▄▄▄▄▄▄▄"
  18643. " ▌max  y  min▐   (TC) Macros que generan código en línea para encontrar el"
  18644. " ▀▀▀▀▀▀▀▀▀▀▀▀▀   valor máximo y mínimo de dos enteros."
  18645. " ▄▄▄▄▄▄▄▄"
  18646. " ▌putenv▐   (TC) Añade una cadena al entorno actual."
  18647. " ▀▀▀▀▀▀▀▀"
  18648. endt
  18649. " ▄▄▄▄▄▄▄"
  18650. " ▌qsort▐   Ordena usando el algoritmo quicksort (ordenación rápida)."
  18651. " ▀▀▀▀▀▀▀"
  18652. " ▄▄▄▄▄▄"
  18653. " ▌rand▐   Generador de números aleatorios."
  18654. " ▀▀▀▀▀▀"
  18655. begint
  18656. " ▄▄▄▄▄▄▄▄"
  18657. " ▌random▐   (TC) Macro que devuelve un entero."
  18658. " ▀▀▀▀▀▀▀▀"
  18659. " ▄▄▄▄▄▄▄▄▄▄▄"
  18660. " ▌randomize▐   (TC) Macro que inicializa el generador de números aleatorios."
  18661. " ▀▀▀▀▀▀▀▀▀▀▀"
  18662. endt
  18663. " ▄▄▄▄▄▄▄▄▄"
  18664. " ▌realloc▐   Reasigna memoria principal."
  18665. " ▀▀▀▀▀▀▀▀▀"
  18666. begint
  18667. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄   (TC)"
  18668. " ▌_rotl and _rotr▐   Rota un valor unsigned int a la izquierda (_rotl)."
  18669. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   Rota un valor unsigned int a la derecha (_rotr)."
  18670. endt
  18671. " ▄▄▄▄▄▄▄"
  18672. " ▌srand▐   Inicializa el generador de números aleatorios."
  18673. " ▀▀▀▀▀▀▀"
  18674. " ▄▄▄▄▄▄▄▄"
  18675. " ▌strtod▐   Convierte cadena a double."
  18676. " ▀▀▀▀▀▀▀▀"
  18677. " ▄▄▄▄▄▄▄▄"
  18678. " ▌strtol▐   Conviete cadena a long usando la base fijada."
  18679. " ▀▀▀▀▀▀▀▀"
  18680. " ▄▄▄▄▄▄▄▄▄"
  18681. " ▌strtoul▐   Convierte una cadena a un unsigned long con la base fijada."
  18682. " ▀▀▀▀▀▀▀▀▀"
  18683. begint
  18684. " ▄▄▄▄▄▄"
  18685. " ▌swab▐   (TC) Intercambia bytes."
  18686. " ▀▀▀▀▀▀"
  18687. endt
  18688. " ▄▄▄▄▄▄▄▄"
  18689. " ▌system▐   Ejecuta un comando DOS."
  18690. " ▀▀▀▀▀▀▀▀"
  18691. begint
  18692. " ▄▄▄▄▄▄▄"
  18693. " ▌ultoa▐   (TC) Convierte un unsigned long a una cadena."
  18694. " ▀▀▀▀▀▀▀"
  18695. endt
  18696. ""
  18697. ""
  18698. "FUNCIONES:"
  18699. "**********"
  18700. ""
  18701. " ▄▄▄▄▄▄▄"
  18702. " ▌abort▐   Termina anormalmente un programa."
  18703. " ▀▀▀▀▀▀▀"
  18704. ""
  18705. " Sintaxis:"
  18706. "   void abort (void);"
  18707. ""
  18708. "Ejemplo:"
  18709. ""
  18710. "  #include <stdio.h>"
  18711. "  #include <stdlib.h>"
  18712. ""
  18713. "  int main (void)"
  18714. "  {"
  18715. "    printf ("Llamando a abort()\n");"
  18716. "    abort ();"
  18717. "    return 0; /* Esta línea nunca es ejecutada */"
  18718. "  }"
  18719. ""
  18720. ""
  18721. " ▄▄▄▄▄"
  18722. " ▌abs▐   Devuelve el valor absoluto de un entero."
  18723. " ▀▀▀▀▀"
  18724. ""
  18725. " Sintaxis:"
  18726. "   int abs (int x);"
  18727. ""
  18728. "Ejemplo:"
  18729. ""
  18730. "  #include <stdio.h>"
  18731. "  #include <math.h>"
  18732. ""
  18733. "  int main (void)"
  18734. "  {"
  18735. "    printf ("\nabs(4): %d", abs (4));"
  18736. "    printf ("\nabs(-5): %d", abs (-5));"
  18737. "    return 0;"
  18738. "  }"
  18739. ""
  18740. ""
  18741. " ▄▄▄▄▄▄▄▄"
  18742. " ▌atexit▐   Registra una función de terminación."
  18743. " ▀▀▀▀▀▀▀▀"
  18744. ""
  18745. " Sintaxis:"
  18746. "   int atexit (atexit_t func);"
  18747. ""
  18748. "La función atexit() fija la función apuntada por func como la función a ser"
  18749. "llamada una vez alcanzada la terminación normal del programa. Es decir, al"
  18750. "final de la ejecución de un programa, se llama a la función especificada."
  18751. ""
  18752. "La función atexit() devuelve 0 si la función queda establecida como función"
  18753. "de terminación; en cualquier otro caso devuelve un valor distinto de cero."
  18754. ""
  18755. "Se pueden fijar varias funciones de terminación siendo llamadas en orden"
  18756. "inverso al de su establecimiento. En otras palabras, la naturaleza del pro-"
  18757. "ceso de registro es como una pila."
  18758. ""
  18759. "El tipo atexit_t está declarado del siguiente modo:"
  18760. ""
  18761. "typedef void (* atexit_t) (void);"
  18762. ""
  18763. "Ejemplo:"
  18764. ""
  18765. "  #include <stdio.h>"
  18766. "  #include <stdlib.h>"
  18767. ""
  18768. "  void exit_fn1 (void)"
  18769. "  {"
  18770. "    printf ("Llamada función de salida número 1\n");"
  18771. "  }"
  18772. ""
  18773. "  void exit_fn2 (void)"
  18774. "  {"
  18775. "    printf ("Llamada función de salida número 2\n");"
  18776. "  }"
  18777. ""
  18778. "  int main (void)"
  18779. "  {"
  18780. "     atexit (exit_fn1);"
  18781. "     atexit (exit_fn2);"
  18782. "     return 0;"
  18783. "  }"
  18784. ""
  18785. ""
  18786. " ▄▄▄▄▄▄"
  18787. " ▌atof▐   Convierte una cadena a un punto flotante."
  18788. " ▀▀▀▀▀▀"
  18789. ""
  18790. " Sintaxis:"
  18791. "   double atof (const char *s);"
  18792. ""
  18793. "La función atof() convierte la cadena apuntada por s a un valor de tipo"
  18794. "double. La cadena debe contener un número válido en como flotante. Si no"
  18795. "es este el caso, se devuelve el valor 0."
  18796. ""
  18797. "Ejemplo:"
  18798. ""
  18799. "  #include <stdlib.h>"
  18800. "  #include <stdio.h>"
  18801. ""
  18802. "  int main (void)"
  18803. "  {"
  18804. "    float f;"
  18805. "    char *str = "123.4ABC";"
  18806. ""
  18807. "    f = atof (str);"
  18808. "    printf ("string = %s float = %f\n", str, f);"
  18809. "    return 0;"
  18810. "  }"
  18811. ""
  18812. ""
  18813. " ▄▄▄▄▄▄"
  18814. " ▌atoi▐   Convierte una cadena en un entero."
  18815. " ▀▀▀▀▀▀"
  18816. ""
  18817. " Sintaxis:"
  18818. "   int atoi (const char *s);"
  18819. ""
  18820. "La función atoi() convierte la cadena apuntada por s a un valor int. La"
  18821. "cadena debe contener un número entero válido. Si no es este el caso, se"
  18822. "devuelve el valor 0."
  18823. ""
  18824. "Ejemplo:"
  18825. ""
  18826. "  #include <stdlib.h>"
  18827. "  #include <stdio.h>"
  18828. ""
  18829. "  int main (void)"
  18830. "  {"
  18831. "    int n;"
  18832. "    char *str = "12345.67";"
  18833. ""
  18834. "    n = atoi (str);"
  18835. "    printf ("string = %s integer = %d\n", str, n);"
  18836. "    return 0;"
  18837. "  }"
  18838. ""
  18839. ""
  18840. " ▄▄▄▄▄▄"
  18841. " ▌atol▐   Convierte un string a un long."
  18842. " ▀▀▀▀▀▀"
  18843. ""
  18844. " Sintaxis:"
  18845. "   long atol (const char *s);"
  18846. ""
  18847. "La función atol() convierte la cadena apuntada por s a un valor long int. La"
  18848. "cadena debe contener un número entero de tipo long válido. Si no es este el"
  18849. "caso, se devuelve el valor 0."
  18850. ""
  18851. "Ejemplo:"
  18852. ""
  18853. "  #include <stdlib.h>"
  18854. "  #include <stdio.h>"
  18855. ""
  18856. "  int main (void)"
  18857. "  {"
  18858. "     long l;"
  18859. "     char *str = "98765432";"
  18860. ""
  18861. "     l = atol (str);"
  18862. "     printf ("string = %s integer = %ld\n", str, l);"
  18863. "     return (0);"
  18864. "  }"
  18865. ""
  18866. ""
  18867. " ▄▄▄▄▄▄▄▄▄"
  18868. " ▌bsearch▐   Búsqueda binaria."
  18869. " ▀▀▀▀▀▀▀▀▀"
  18870. ""
  18871. " Sintaxis:"
  18872. ""
  18873. "  void *bsearch (const void *clave, const void *base, unsigned int *num,"
  18874. "    unsigned int tam, int (*compara) (const void *arg1, const void *arg2));"
  18875. "    unsigned int tam, int (*compara) (void *arg1, void *arg2));"
  18876. ""
  18877. "La función bsearch() realiza una búsqueda binaria en el array ordenado"
  18878. "apuntado por base y devuelve un puntero al primer elemento que se corres-"
  18879. "ponde con la clave apuntada por clave. El número de elementos en el array"
  18880. "está especificado por num y el tamaño (en bytes) de cada elemento está"
  18881. "descrito por tam."
  18882. ""
  18883. "La función apuntada por compara se utiliza para comparar un elemento del"
  18884. "array con la clave. La forma de la función de comparación debe ser:"
  18885. ""
  18886. "  nombre_func (void *arg1, void *arg2);"
  18887. ""
  18888. "Debe devolver los siguientes valores:"
  18889. ""
  18890. "  Si arg1 es menor que arg2, devuelve un valor menor que 0."
  18891. "  Si arg1 es igual que arg2, devuelve 0."
  18892. "  Si arg1 es mayor que arg2, devuelve un valor mayor que 0."
  18893. ""
  18894. "El array debe estar ordenado en orden ascendente con la menor dirección"
  18895. "conteniendo el elemento más pequeño. Si el array no contiene la clave,"
  18896. "se devuelve un puntero nulo."
  18897. ""
  18898. "Esta función está implementada en uno de los ejemplos de la lección 3."
  18899. ""
  18900. ""
  18901. "Ejemplo:"
  18902. ""
  18903. "  #include <stdlib.h>"
  18904. "  #include <stdio.h>"
  18905. ""
  18906. "  #define NUM_ELEMENTOS(array) (sizeof(array) / sizeof(array[0]))"
  18907. ""
  18908. "  int array_de_numeros[] = { 123, 145, 512, 627, 800, 933, 333, 1000 };"
  18909. ""
  18910. "  int comparacion_de_numeros (const int *p1, const int *p2)"
  18911. "  {"
  18912. "    return (*p1 - *p2);"
  18913. "  }"
  18914. ""
  18915. "  int buscar (int clave)"
  18916. "  {"
  18917. "     int *puntero_a_elemento;"
  18918. ""
  18919. "     /* El molde (int (*) (const void *, const void *)) es necesario para"
  18920. "        evitar un error de tipo distinto en tiempo de compilación. Sin"
  18921. "        embargo, no es necesario: puntero_a_elemento = (int *) bsearch (..."
  18922. "        debido a que en este caso es el compilador el que realiza la"
  18923. "        conversión de tipos */"
  18924. "     puntero_a_elemento = bsearch (&clave, array_de_numeros,"
  18925. "       NUM_ELEMENTOS (array_de_numeros), sizeof (int),"
  18926. "       (int (*) (const void *, const void *)) comparacion_de_numeros);"
  18927. ""
  18928. "     return (puntero_a_elemento != NULL);"
  18929. "  }"
  18930. ""
  18931. "  int main (void)"
  18932. "  {"
  18933. "    if (buscar (800))"
  18934. "      printf ("800 está en la tabla.\n");"
  18935. "    else"
  18936. "      printf ("800 no está en la tabla.\n");"
  18937. ""
  18938. "    return 0;"
  18939. "  }"
  18940. ""
  18941. ""
  18942. " ▄▄▄▄▄▄▄▄"
  18943. " ▌calloc▐   Asigna memoria principal."
  18944. " ▀▀▀▀▀▀▀▀"
  18945. ""
  18946. " Sintaxis:"
  18947. "   void *calloc (size_t nelems, size_t tam);"
  18948. ""
  18949. "El prototipo de esta función también se encuentra en el fichero stdlib.h."
  18950. ""
  18951. "Asigna espacio para nelems elementos de tam bytes cada uno y almacena cero"
  18952. "en el área."
  18953. ""
  18954. "Devuelve un puntero al nuevo bloque asignado o NULL si no existe bastante"
  18955. "espacio."
  18956. ""
  18957. "Ejemplo:"
  18958. ""
  18959. "  #include <stdio.h>"
  18960. "  #include <alloc.h>"
  18961. ""
  18962. "  int main (void)"
  18963. "  {"
  18964. "    char *str = NULL;"
  18965. ""
  18966. "    /* asigna memoria para el string */"
  18967. "    str = calloc (10, sizeof (char));"
  18968. ""
  18969. "    /* copia "Hola" en string */"
  18970. "    strcpy (str, "Hello");"
  18971. ""
  18972. "    /* visualiza string */"
  18973. "    printf ("El string es %s\n", str);"
  18974. ""
  18975. "    /* libera memoria */"
  18976. "    free (str);"
  18977. ""
  18978. "    return 0;"
  18979. "  }"
  18980. ""
  18981. ""
  18982. " ▄▄▄▄▄"
  18983. " ▌div▐   Divide dos enteros."
  18984. " ▀▀▀▀▀"
  18985. ""
  18986. " Sintaxis:"
  18987. "   div_t div (int numer, int denom);"
  18988. ""
  18989. "La función div() divide dos enteros y devuelve el cociente y el resto como"
  18990. "un tipo div_t. Los parametros numer y denom son el numerador y el denomina-"
  18991. "dor respectivamente. El tipo div_t es una estructura de enteros definida"
  18992. "(con typdef) en stdlib.h como sigue:"
  18993. ""
  18994. "  typedef struct"
  18995. "    {"
  18996. "      long int quot; /* cociente */"
  18997. "      long int rem;  /* resto    */"
  18998. "    } div_t;"
  18999. ""
  19000. "Ejemplo:"
  19001. ""
  19002. "  #include <stdlib.h>"
  19003. "  #include <stdio.h>"
  19004. ""
  19005. "  int main (void)"
  19006. "  {"
  19007. "    div_t x = div (10, 3);"
  19008. "    printf ("10 div 3 = %d resto %d\n", x.quot, x.rem);"
  19009. "    return 0;"
  19010. "  }"
  19011. ""
  19012. ""
  19013. begint
  19014. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  19015. " ▌ecvt  y  fcvt▐   (TC) Convierte número en coma flotante a cadena."
  19016. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  19017. ""
  19018. " Sintaxis:"
  19019. "   char *ecvt (double valor, int ndig, int *dec, int *sign);"
  19020. "   char *fcvt (double valor, int ndig, int *dec, int *sign);"
  19021. ""
  19022. "Para ecvt(), ndig es el número de dígitos a almacenar, mientras que en"
  19023. "fcvt() es el número de dígitos a almacenar depués del punto decimal. El"
  19024. "valor devuelto apunta a un área estática que es sobreescrita en la pró-"
  19025. "xima llamada."
  19026. ""
  19027. "Ejemplo:"
  19028. ""
  19029. "  #include <stdlib.h>"
  19030. "  #include <stdio.h>"
  19031. "  #include <conio.h>"
  19032. ""
  19033. "  int main (void)"
  19034. "  {"
  19035. "    char *string;"
  19036. "    double valor;"
  19037. "    int dec, sign;"
  19038. "    int ndig = 10;"
  19039. ""
  19040. "    clrscr ();"
  19041. "    valor = 9.876; /* número regular */ "
  19042. "    string = ecvt (valor, ndig, &dec, &sign);"
  19043. "    printf ("string = %s\tdec = %d\tsign = %d\n", string, dec, sign);"
  19044. ""
  19045. "    valor = -123.45; /* número negativo */"
  19046. "    ndig = 15;"
  19047. "    string = ecvt (valor, ndig, &dec, &sign);"
  19048. "    printf ("string = %s\tdec = %d\tsign = %d\n", string, dec, sign);"
  19049. ""
  19050. "    valor = 0.6789e5; /* notación científica */"
  19051. "    ndig = 5;"
  19052. "    string = ecvt (valor, ndig, &dec, &sign);"
  19053. "    printf ("string = %s\tdec = %d\tsign = %d\n", string, dec, sign);"
  19054. ""
  19055. "    return 0;"
  19056. "  }"
  19057. ""
  19058. ""
  19059. endt
  19060. " ▄▄▄▄▄▄"
  19061. " ▌exit▐   Termina programa."
  19062. " ▀▀▀▀▀▀"
  19063. ""
  19064. " Sintaxis:"
  19065. "   void exit (int estado);"
  19066. ""
  19067. "Antes de terminar, la salida buffereada es volcada, los ficheros son"
  19068. "cerrados y las funciones exit() son llamadas."
  19069. begint
  19070. ""
  19071. "En Turbo C, el prototipo de esta función también se encuentra en el fichero"
  19072. "process.h."
  19073. endt
  19074. ""
  19075. "Ejemplo:"
  19076. ""
  19077. "  #include <stdlib.h>"
  19078. "  #include <conio.h>"
  19079. "  #include <stdio.h>"
  19080. ""
  19081. "  int main (void)"
  19082. "  {"
  19083. "    int estado;"
  19084. ""
  19085. "    printf ("Introduce 1 ó 2\n");"
  19086. "    estado = getch ();"
  19087. "    /* Pone el errorlevel del DOS */"
  19088. "    exit (estado - '0');"
  19089. ""
  19090. "    return 0; /* esta línea nunca es ejecutada */"
  19091. "  }"
  19092. ""
  19093. ""
  19094. " ▄▄▄▄▄▄▄"
  19095. " ▌_exit▐   Termina programa."
  19096. " ▀▀▀▀▀▀▀"
  19097. ""
  19098. " Sintaxis:"
  19099. "   void _exit (int estado);"
  19100. ""
  19101. ""
  19102. begint
  19103. " ▄▄▄▄▄▄"
  19104. " ▌fcvt▐   (TC) [Ver ecvt()]"
  19105. " ▀▀▀▀▀▀"
  19106. ""
  19107. ""
  19108. endt
  19109. " ▄▄▄▄▄▄"
  19110. " ▌free▐   Libera bloques asignados con malloc() o calloc()."
  19111. " ▀▀▀▀▀▀"
  19112. ""
  19113. " Sintaxis:"
  19114. "   void free (void *bloque);"
  19115. ""
  19116. "Ejemplo:"
  19117. ""
  19118. "  #include <string.h>"
  19119. "  #include <stdio.h>"
  19120. "  #include <alloc.h>"
  19121. ""
  19122. "  int main (void)"
  19123. "  {"
  19124. "    char *str;"
  19125. ""
  19126. "    /* asigna memoria para el string */"
  19127. "    str = malloc (10);"
  19128. ""
  19129. "    /* copia "Hola" en string */"
  19130. "    strcpy (str, "Hola");"
  19131. ""
  19132. "    /* visualiza string */"
  19133. "    printf ("El string es %s\n", str);"
  19134. ""
  19135. "    /* libera memoria */"
  19136. "    free (str);"
  19137. ""
  19138. "    return 0;"
  19139. "  }"
  19140. ""
  19141. ""
  19142. begint
  19143. " ▄▄▄▄▄▄"
  19144. " ▌gcvt▐   (TC) Convierte un número en coma flotante a string."
  19145. " ▀▀▀▀▀▀"
  19146. ""
  19147. " Sintaxis:"
  19148. "   char *gcvt (double valor, int ndec, char *buf);"
  19149. ""
  19150. "Devuelve la dirección del string apuntado por buf."
  19151. ""
  19152. ""
  19153. endt
  19154. " ▄▄▄▄▄▄▄▄"
  19155. " ▌getenv▐   Obtiene un string del entorno."
  19156. " ▀▀▀▀▀▀▀▀"
  19157. ""
  19158. " Sintaxis:"
  19159. "   char *getenv (const char *nombre);"
  19160. ""
  19161. "La función getenv() devuelve un puntero a la información de entorno"
  19162. "asociada con la cadena apuntada por nombre en la tabla de información"
  19163. "de entorno definida por la implementación. La cadena devuelta no debe"
  19164. "ser cambiada nunca por el programa."
  19165. ""
  19166. "El entorno de un programa puede incluir cosas como nombres de caminos"
  19167. "y los dispositivos que están conectados. La naturaleza exacta de estos"
  19168. "datos viene definida por la implementación."
  19169. ""
  19170. "Si se hace una llamada a getenv() con un argumento que no se corresponde"
  19171. "con ninguno de los datos del entorno, se devuelve un puntero nulo."
  19172. ""
  19173. "Ejemplo:"
  19174. ""
  19175. "  #include <stdlib.h>"
  19176. "  #include <stdio.h>"
  19177. ""
  19178. "  int main (void)"
  19179. "  {"
  19180. "    char *s;"
  19181. ""
  19182. "    s = getenv ("COMSPEC");"
  19183. "    printf ("Procesador de comando: %s\n",s);"
  19184. ""
  19185. "    return 0;"
  19186. "  }"
  19187. ""
  19188. ""
  19189. " ▄▄▄▄▄▄"
  19190. " ▌itoa▐   Convierte un entero a una cadena."
  19191. " ▀▀▀▀▀▀"
  19192. ""
  19193. " Sintaxis:"
  19194. "   char *itoa (int valor, char *cad, int radix);"
  19195. ""
  19196. "La función itoa() convierte el entero valor a su cadena equivalente y sitúa"
  19197. "el resultado en la cadena apuntada por cad. La base de la cadena de salida"
  19198. "se determina por radix, que se encuentra normalmente en el rango de 2 a 16."
  19199. ""
  19200. "La función itoa() devuelve un puntero a cad. Lo mismo se puede hacer con"
  19201. "sprintf()."
  19202. ""
  19203. "Ejemplo:"
  19204. ""
  19205. "  #include <stdlib.h>"
  19206. "  #include <stdio.h>"
  19207. ""
  19208. "  int main (void)"
  19209. "  {"
  19210. "    int numero = 12345;"
  19211. "    char cadena[25];"
  19212. ""
  19213. "    itoa (numero, cadena, 10);"
  19214. "    printf ("intero = %d cadena = %s\n", numero, cadena);"
  19215. "    return 0;"
  19216. "  }"
  19217. ""
  19218. ""
  19219. " ▄▄▄▄▄▄"
  19220. " ▌labs▐   Calcula el valor absoluto de un long."
  19221. " ▀▀▀▀▀▀"
  19222. ""
  19223. " Sintaxis:"
  19224. "   long int labs (long int x);"
  19225. ""
  19226. "Ejemplo:"
  19227. ""
  19228. "  #include <stdio.h>"
  19229. "  #include <math.h>"
  19230. ""
  19231. "  int main (void)"
  19232. "  {"
  19233. "    long resultado;"
  19234. "    long x = -12345678L;"
  19235. ""
  19236. "    resultado = labs (x);"
  19237. "    printf ("número: %ld valor absoluto: %ld\n", x, resultado);"
  19238. ""
  19239. "    return 0;"
  19240. "  }"
  19241. ""
  19242. ""
  19243. " ▄▄▄▄▄▄"
  19244. " ▌ldiv▐   Divide dos longs, devuelve el cociente y el resto."
  19245. " ▀▀▀▀▀▀"
  19246. ""
  19247. " Sintaxis:"
  19248. "   ldiv_t ldiv (long int numer, long int denom);"
  19249. ""
  19250. "La función div() divide dos longs y devuelve el cociente y el resto como un"
  19251. "tipo ldiv_t. Los parametros numer y denom son el numerador y el denominador"
  19252. "respectivamente. El tipo ldiv_t es una estructura de enteros definida (con"
  19253. "typdef) en stdlib.h como sigue:"
  19254. ""
  19255. "  typedef struct"
  19256. "    {"
  19257. "      long int quot; /* cociente */"
  19258. "      long int rem;  /* resto    */"
  19259. "    } ldiv_t;"
  19260. ""
  19261. "Ejemplo:"
  19262. ""
  19263. "  #include <stdlib.h>"
  19264. "  #include <stdio.h>"
  19265. ""
  19266. "  int main (void)"
  19267. "  {"
  19268. "    ldiv_t lx;"
  19269. "    lx = ldiv (100000L, 30000L);"
  19270. "    printf ("100000 div 30000 = %ld resto %ld\n", lx.quot, lx.rem);"
  19271. "    return 0;"
  19272. "  }"
  19273. ""
  19274. ""
  19275. begint
  19276. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  19277. " ▌lfind and lsearch▐   (TC) Ejecuta búsqueda lineal."
  19278. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  19279. ""
  19280. " Sintaxis:"
  19281. "  void *lfind (const void *clave, const void *base,"
  19282. "              size_t *num, size_t anchura,"
  19283. "              int (*func_de_comp) (const void *elem1, const void *elem2));"
  19284. ""
  19285. "  void *lsearch (const void *clave, void *base, size_t *num, size_t anchura,"
  19286. "                int (*func_de_comp) (const void *elem1, const void *elem2));"
  19287. ""
  19288. "Estas funciones utilizan una rutina definida por el usuario (func_de_comp)"
  19289. "para la búsqueda de la clave, en un array de elementos secuenciales."
  19290. ""
  19291. "El array tiene num elementos, cada uno de tamaño anchura bytes y comienza"
  19292. "en la dirección de memoria apuntada por base."
  19293. ""
  19294. "Devuelve la dirección de la primera entrada en la tabla que coincida con"
  19295. "la clave buscada. Si la clave buscada no se encuentra, lsearch la añade a"
  19296. "la lista; lfind devuelve 0."
  19297. ""
  19298. "La rutina *func_de_comp debe devolver cero si *elem1 == *elem2, y un valor"
  19299. "distinto de cero en caso contrario."
  19300. ""
  19301. "Ejemplo de la función lfind:"
  19302. ""
  19303. "  #include <stdio.h>"
  19304. "  #include <stdlib.h>"
  19305. ""
  19306. "  int comparar (int *x, int *y)"
  19307. "  {"
  19308. "    return (*x - *y);"
  19309. "  }"
  19310. ""
  19311. "  int main (void)"
  19312. "  {"
  19313. "    int array[5] = { 5, -1, 100, 99, 10 };"
  19314. "    size_t nelem = 5;"
  19315. "    int clave;"
  19316. "    int *resultado;"
  19317. ""
  19318. "    clave = 99;"
  19319. "    resultado = lfind (&clave, array, &nelem, sizeof (int),"
  19320. "                (int (*) (const void *, const void *)) comparar);"
  19321. "    if (resultado)"
  19322. "      printf ("Número %d encontrado\n", clave);"
  19323. "    else"
  19324. "      printf ("Número %d no encontrado.\n", clave);"
  19325. ""
  19326. "    return 0;"
  19327. "  }"
  19328. ""
  19329. "Ejemplo de la función lsearch:"
  19330. ""
  19331. "  #include <stdlib.h>"
  19332. "  #include <stdio.h>"
  19333. ""
  19334. "  int numeros[10] = { 3, 5, 1 };"
  19335. "  int nnumeros = 3;"
  19336. ""
  19337. "  int comparar_numeros (int *num1, int *num2)"
  19338. "  {"
  19339. "    return (*num1 - *num2);"
  19340. "  }"
  19341. ""
  19342. "  int aniadir_elemento (int numero_clave)"
  19343. "  {"
  19344. "    int viejo_nnumeros = nnumeros;"
  19345. ""
  19346. "    lsearch ((void *) &numero_clave, numeros,"
  19347. "             (size_t *) &nnumeros, sizeof (int),"
  19348. "             (int (*) (const void *, const void *)) comparar_numeros);"
  19349. ""
  19350. "    return (nnumeros == viejo_nnumeros);"
  19351. "  }"
  19352. ""
  19353. "  int main (void)"
  19354. "  {"
  19355. "    register int i;"
  19356. "    int clave = 2;"
  19357. ""
  19358. "    if (aniadir_elemento (clave))"
  19359. "      printf ("%d está ya en la tabla de números.\n", clave);"
  19360. "    else"
  19361. "      printf ("%d está añadido a la tabla de números.\n", clave);"
  19362. ""
  19363. "    printf ("Números en tabla:\n");"
  19364. "    for (i = 0; i < nnumeros; i++)"
  19365. "      printf ("%d\n", numeros[i]);"
  19366. ""
  19367. "    return 0;"
  19368. "  }"
  19369. ""
  19370. ""
  19371. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄   (TC)"
  19372. " ▌_lrotl and _lrotr▐   Rota un valor long a la izquierda (_lrotl)."
  19373. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   Rota un valor long a la derecha (_lrotr)."
  19374. ""
  19375. " Sintaxis:"
  19376. "   unsigned long _lrotr (unsigned long val, int cont);"
  19377. "   unsigned long _lrotl (unsigned long val, int cont);"
  19378. ""
  19379. "Las dos funciones devuelven el valor de val rotado cont bits."
  19380. ""
  19381. "Ejemplo:"
  19382. ""
  19383. "  /* ejemplo lrotl */"
  19384. ""
  19385. "  #include <stdlib.h>"
  19386. "  #include <stdio.h>"
  19387. ""
  19388. "  int main (void)"
  19389. "  {"
  19390. "    unsigned long resultado;"
  19391. "    unsigned long valor = 100;"
  19392. ""
  19393. "    resultado = _lrotl (valor, 1);"
  19394. "    printf ("El valor %lu rotado un bit a la izquierda es: %lu\n","
  19395. "            valor, resultado);"
  19396. ""
  19397. "    return 0;"
  19398. "  }"
  19399. ""
  19400. "  /* ejemplo lrotr */"
  19401. ""
  19402. "  #include <stdlib.h>"
  19403. "  #include <stdio.h>"
  19404. ""
  19405. "  int main (void)"
  19406. "  {"
  19407. "    unsigned long resultado;"
  19408. "    unsigned long valor = 100;"
  19409. ""
  19410. "    resultado = _lrotr (valor, 1);"
  19411. "    printf ("El valor %lu rotado un bit a la derecha es: %lu\n","
  19412. "            valor, resultado);"
  19413. ""
  19414. "    return 0;"
  19415. "  }"
  19416. ""
  19417. ""
  19418. " ▄▄▄▄▄▄▄▄▄"
  19419. " ▌lsearch▐   (TC) [Ver lfind()]"
  19420. " ▀▀▀▀▀▀▀▀▀"
  19421. ""
  19422. ""
  19423. endt
  19424. " ▄▄▄▄▄▄"
  19425. " ▌ltoa▐   Convierte un long a una cadena."
  19426. " ▀▀▀▀▀▀"
  19427. ""
  19428. " Sintaxis:"
  19429. "   char *ltoa (long valor, char *cadena, int radix);"
  19430. ""
  19431. "Para una representación decimal, usa radix=10. Para hexadecimal, usa "
  19432. "radix=16."
  19433. ""
  19434. "Devuelve un puntero al argumento cadena."
  19435. ""
  19436. "Ejemplo:"
  19437. ""
  19438. "  #include <stdlib.h>"
  19439. "  #include <stdio.h>"
  19440. ""
  19441. "  int main (void)"
  19442. "  {"
  19443. "    char cadena[25];"
  19444. "    long valor = 123456789L;"
  19445. ""
  19446. "    ltoa (valor, cadena, 10);"
  19447. "    printf ("número = %ld  cadena = %s\n", valor, cadena);"
  19448. ""
  19449. "    return 0;"
  19450. "  }"
  19451. ""
  19452. ""
  19453. " ▄▄▄▄▄▄▄▄"
  19454. " ▌malloc▐   Asigna memoria principal."
  19455. " ▀▀▀▀▀▀▀▀"
  19456. ""
  19457. " Sintaxis:"
  19458. "   void *malloc (size_t tam);"
  19459. ""
  19460. "El parámetro tam está en bytes. Devuelve un puntero al nuevo bloque"
  19461. "asignado, o NULL si no existe suficiente espacio para el nuevo bloque."
  19462. "Si tam == 0, devuelve NULL."
  19463. ""
  19464. "Ejemplo:"
  19465. ""
  19466. "  #include <stdio.h>"
  19467. "  #include <string.h>"
  19468. "  #include <alloc.h>"
  19469. "  #include <stdlib.h>"
  19470. ""
  19471. "  int main (void)"
  19472. "  {"
  19473. "    char *str;"
  19474. ""
  19475. "    if ((str = (char *) malloc (10)) == NULL)"
  19476. "      {"
  19477. "        printf ("Memoria insuficiente\n");"
  19478. "        exit (1);"
  19479. "      }"
  19480. ""
  19481. "    strcpy (str, "Hola");"
  19482. ""
  19483. "    printf ("El string es %s\n", str);"
  19484. ""
  19485. "    free (str);"
  19486. ""
  19487. "    return 0;"
  19488. "  }"
  19489. ""
  19490. ""
  19491. " ▄▄▄▄▄▄▄▄▄▄▄▄▄"
  19492. " ▌max  y  min▐   (TC) Macros que generan código en línea para encontrar el"
  19493. " ▀▀▀▀▀▀▀▀▀▀▀▀▀   valor máximo y mínimo de dos enteros."
  19494. ""
  19495. " Sintaxis:"
  19496. "   max(a,b)  máximo de dos enteros a y b"
  19497. "   min(a,b)  mínimo de dos enteros a y b"
  19498. ""
  19499. ""
  19500. begint
  19501. " ▄▄▄▄▄▄▄▄"
  19502. " ▌putenv▐   (TC) Añade una cadena al entorno actual."
  19503. " ▀▀▀▀▀▀▀▀"
  19504. ""
  19505. " Sintaxis:"
  19506. "   int putenv (const char *nombre);"
  19507. ""
  19508. "En caso de éxito, putenv() devuelve 0; en caso de fallo, devuelve -1."
  19509. ""
  19510. ""
  19511. endt
  19512. " ▄▄▄▄▄▄▄"
  19513. " ▌qsort▐   Ordena usando el algoritmo quicksort (ordenación rápida)."
  19514. " ▀▀▀▀▀▀▀"
  19515. ""
  19516. " Sintaxis:"
  19517. ""
  19518. "   void qsort (void *base, size_t num, size_t tam,"
  19519. "               int (*compara) (const void *, const void *));"
  19520. ""
  19521. "La función qsort() ordena el array apuntado por base utilizando el"
  19522. "método de ordenación de C.A.R. Hoare (este método se ha explicado en"
  19523. "el ejemplo 3 de la lección 5). El número de elementos en el array se"
  19524. "especifica mediante num, y el tamaño en bytes de cada elemento está"
  19525. "descrito por tam."
  19526. ""
  19527. "La función compara se utiliza para comparar un elemento del array con"
  19528. "la clave. La comparación debe ser:"
  19529. ""
  19530. "  int nombre_func (void *arg1, void *arg2);"
  19531. ""
  19532. "Debe devolver los siguientes valores:"
  19533. ""
  19534. "  Si arg1 es menor que arg2, devuelve un valor menor que 0."
  19535. "  Si arg1 es igual a arg2 devuelve 0."
  19536. "  Si arg1 es mayor que arg2, devuelve un valor mayor que 0."
  19537. ""
  19538. "El array es ordenado en orden ascendente con la dirección más pequeña"
  19539. "conteniendo el menor elemento."
  19540. ""
  19541. "Veamos un ejemplo de la utilización de esta función, donde podemos"
  19542. "apreciar además, dos formas posibles de declaración y utilización"
  19543. "de la función de comparación requerida por la función qsort()."
  19544. ""
  19545. "  #include <stdio.h>  /* printf () */"
  19546. "  #include <stdlib.h> /* qsort () */"
  19547. ""
  19548. "  void main (void)"
  19549. "  {"
  19550. "    int num[10] = { 3, 2, 8, 9, 2, 2, 1, -2, 3, 2 };"
  19551. "    register int i;"
  19552. "    int comparar_creciente (const void *elem1, const void *elem2);"
  19553. "    int comparar_decreciente (const int *elem1, const int *elem2);"
  19554. ""
  19555. "    printf ("\nArray desordenado: ");"
  19556. "    for (i = 0; i < 10; i++)"
  19557. "      printf ("%d ", num[i]);"
  19558. ""
  19559. "    qsort (num, 10, sizeof (int), comparar_creciente);"
  19560. ""
  19561. "    printf ("\nArray ordenado en orden creciente: ");"
  19562. "    for (i = 0; i < 10; i++)"
  19563. "      printf ("%d ", num[i]);"
  19564. ""
  19565. "    /*"
  19566. "       el molde del cuarto argumento convierte el tipo"
  19567. "         (int (*) (const int *, const int *))"
  19568. "       al tipo"
  19569. "         (int (*) (const void *, const void *))"
  19570. "       que es el que requiere la función qsort"
  19571. "    */"
  19572. "    qsort (num, 10, sizeof (int),"
  19573. "           (int (*) (const void *, const void *)) comparar_decreciente);"
  19574. ""
  19575. "    printf ("\nArray ordenado en orden decreciente: ");"
  19576. "    for (i = 0; i < 10; i++)"
  19577. "      printf ("%d ", num[i]);"
  19578. "  }"
  19579. ""
  19580. "  int comparar_creciente (const void *elem1, const void *elem2)"
  19581. "  {"
  19582. "    /* para acceder al contenido de un puntero del tipo (void *)"
  19583. "       necesitamos moldearlo a un tipo base que no sea void */"
  19584. "    return (*(int *)elem1 - *(int *)elem2);"
  19585. "  }"
  19586. ""
  19587. "  int comparar_decreciente (const int *elem1, const int *elem2)"
  19588. "  {"
  19589. "    return (*elem2 - *elem1);"
  19590. "  }"
  19591. ""
  19592. ""
  19593. " ▄▄▄▄▄▄"
  19594. " ▌rand▐   Generador de números aleatorios."
  19595. " ▀▀▀▀▀▀"
  19596. ""
  19597. " Sintaxis:"
  19598. "   int rand (void);"
  19599. ""
  19600. "Devuelve números aleatorios entre 0 y RAND_MAX. RAND_MAX está definido en"
  19601. "stdlib.h"
  19602. ""
  19603. "Ejemplo:"
  19604. ""
  19605. "  #include <stdlib.h>"
  19606. "  #include <stdio.h>"
  19607. ""
  19608. "  int main (void)"
  19609. "  {"
  19610. "    int i;"
  19611. "    printf ("Diez números aleatorios entre 0 y 99\n\n");"
  19612. "    for (i = 0; i < 10; i++)"
  19613. "      printf ("%d\n", rand() % 100);"
  19614. "    return 0;"
  19615. "  }"
  19616. ""
  19617. ""
  19618. begint
  19619. " ▄▄▄▄▄▄▄▄"
  19620. " ▌random▐   (TC) Macro que devuelve un entero."
  19621. " ▀▀▀▀▀▀▀▀"
  19622. ""
  19623. " Sintaxis:"
  19624. "   int random (int num);"
  19625. ""
  19626. "Devuelve un entero entre 0 y (num-1)."
  19627. ""
  19628. "Ejemplo:"
  19629. ""
  19630. "  #include <stdlib.h>"
  19631. "  #include <stdio.h>"
  19632. "  #include <time.h>"
  19633. ""
  19634. "  int main (void)"
  19635. "  {"
  19636. "    randomize ();"
  19637. "    printf ("Número aleatorio en el rango 0-99: %d\n", random (100));"
  19638. "    return 0;"
  19639. "  }"
  19640. ""
  19641. ""
  19642. " ▄▄▄▄▄▄▄▄▄▄▄"
  19643. " ▌randomize▐   (TC) Macro que inicializa el generador de números aleatorios."
  19644. " ▀▀▀▀▀▀▀▀▀▀▀"
  19645. ""
  19646. " Sintaxis:"
  19647. "   void randomize (void);"
  19648. ""
  19649. "Inicializa el generador de números aleatorios con un valor aleatorio. Esta"
  19650. "función usa la función time(), así que debemos incluir time.h cuando usemos"
  19651. "esta rutina."
  19652. ""
  19653. "Ejemplo:"
  19654. ""
  19655. "  #include <stdlib.h>"
  19656. "  #include <stdio.h>"
  19657. "  #include <time.h>"
  19658. ""
  19659. "  int main (void)"
  19660. "  {"
  19661. "    int i;"
  19662. "    randomize ();"
  19663. "    printf("Diez números aleatorios entre 0 y 99\n\n");"
  19664. "    for (i = 0; i < 10; i++)"
  19665. "      printf ("%d\n", rand() % 100);"
  19666. "    return 0;"
  19667. "  }"
  19668. ""
  19669. ""
  19670. endt
  19671. " ▄▄▄▄▄▄▄▄▄"
  19672. " ▌realloc▐   Reasigna memoria principal."
  19673. " ▀▀▀▀▀▀▀▀▀"
  19674. ""
  19675. " Sintaxis:"
  19676. "   void *realloc (void *bloque, size_t tam);"
  19677. ""
  19678. "El prototipo de esta función también se encuentra en el fichero de"
  19679. "cabecera stdlib.h."
  19680. ""
  19681. "Intenta achicar o expandir el bloque asignado previamente a tam bytes."
  19682. "Devuelve la dirección del bloque reasignado, la cual puede ser diferente"
  19683. "de la dirección original."
  19684. ""
  19685. "Si el bloque no puede ser reasignado o tam == 0, reallo() devuelve NULL."
  19686. ""
  19687. "Ejemplo:"
  19688. ""
  19689. "  #include <stdio.h>"
  19690. "  #include <alloc.h>"
  19691. "  #include <string.h>"
  19692. ""
  19693. "  void main (void)"
  19694. "  {"
  19695. "    char *str;"
  19696. ""
  19697. "     /* asigna memoria para string */"
  19698. "    str = malloc (10);"
  19699. ""
  19700. "    /* copia "Hola" en string */"
  19701. "    strcpy (str, "Hola");"
  19702. ""
  19703. "    printf ("El string es %s\n  Está en la dirección %p\n", str, str);"
  19704. "    str = realloc (str, 20);"
  19705. "    printf ("El string is %s\n  Está en la nueva dirección %p\n", str, str);"
  19706. ""
  19707. "    /* libera memoria */"
  19708. "    free (str);"
  19709. "  }"
  19710. ""
  19711. ""
  19712. begint
  19713. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄   (TC)"
  19714. " ▌_rotl and _rotr▐   Rota un valor unsigned int a la izquierda (_rotl)."
  19715. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀   Rota un valor unsigned int a la derecha (_rotr)."
  19716. ""
  19717. " Sintaxis:"
  19718. "   unsigned _rotl (unsigned val, int cont);"
  19719. "   unsigned _rotr (unsigned val, int cont);"
  19720. ""
  19721. "Estas dos funciones devuelven el valor de val rotado cont bits."
  19722. ""
  19723. "Ejemplo:"
  19724. ""
  19725. "  /* ejemplo de _rotl */"
  19726. ""
  19727. "  #include <stdlib.h>"
  19728. "  #include <stdio.h>"
  19729. ""
  19730. "  int main (void)"
  19731. "  {"
  19732. "    unsigned valor, resultado;"
  19733. ""
  19734. "    valor = 32767;"
  19735. "    resultado = _rotl (valor, 1);"
  19736. "    printf ("El valor %u rotado un bit a la izquierda es: %u\n","
  19737. "            valor, resultado);"
  19738. "    return 0;"
  19739. "  }"
  19740. ""
  19741. "  /* ejemplo de _rotr */"
  19742. ""
  19743. "  #include <stdlib.h>"
  19744. "  #include <stdio.h>"
  19745. ""
  19746. "  int main (void)"
  19747. "  {"
  19748. "    unsigned valor, resultado;"
  19749. ""
  19750. "    valor = 32767;"
  19751. "    resultado = _rotr (valor, 1);"
  19752. "    printf ("El valor %u rotando un bit a la derecha es: %u\n","
  19753. "            valor, resultado);"
  19754. "    return 0;"
  19755. "  }"
  19756. ""
  19757. ""
  19758. endt
  19759. " ▄▄▄▄▄▄▄"
  19760. " ▌srand▐   Inicializa el generador de números aleatorios."
  19761. " ▀▀▀▀▀▀▀"
  19762. ""
  19763. " Sintaxis:"
  19764. "   void srand (unsigned semilla);"
  19765. ""
  19766. "La función srand() utiliza semilla para fijar un punto de partida para el"
  19767. "flujo generado por rand(), que devuelve números pseudoaleatorios."
  19768. ""
  19769. "La función srand() se utiliza normalmente para permitir que ejecuciones"
  19770. "múltiples de un programa utilicen diferentes flujos de números pseudoalea-"
  19771. "torios."
  19772. ""
  19773. "Ejemplo:"
  19774. ""
  19775. "  #include <stdlib.h>"
  19776. "  #include <stdio.h>"
  19777. "  #include <time.h>"
  19778. ""
  19779. "  int main (void)"
  19780. "  {"
  19781. "    int i;"
  19782. "    time_t t;"
  19783. ""
  19784. "    srand ((unsigned) time (&t));"
  19785. "    printf("Diez números aleatorios entre 0 y 99\n\n");"
  19786. "    for (i = 0; i < 10; i++)"
  19787. "      printf ("%d\n", rand() % 100);"
  19788. "    return 0;"
  19789. "  }"
  19790. ""
  19791. ""
  19792. " ▄▄▄▄▄▄▄▄"
  19793. " ▌strtod▐   Convierte cadena a double."
  19794. " ▀▀▀▀▀▀▀▀"
  19795. ""
  19796. " Sintaxis:"
  19797. "   double strtod (const char *inic, char **fin);"
  19798. ""
  19799. "La función strtod() convierte la representación de cadena de un número"
  19800. "almacenado en la cadena apuntada por inic a un valor double y devuelve"
  19801. "el resultado."
  19802. ""
  19803. "La función strtod() trabaja de la siguiente forma. Primero, se elimina"
  19804. "cualquier carácter en blanco de la cadena apuntada por inic. A conti-"
  19805. "nuación cada carácter que constituye el número es leído. Cualquier"
  19806. "carácter que no pueda ser parte de un número en coma flotante dará"
  19807. "lugar a que el proceso se detenga. Esto incluye el espacio en blanco,"
  19808. "signos de puntuación distintos del punto, y caracteres que no sean E o"
  19809. "e. Finalmente fin se deja apuntando al resto, si lo hay, de la cadena"
  19810. "original. Esto supone que si strtod() se llama con "10.10abc", se de-"
  19811. "vuelve el valor de 10.10 y fin apunta a la 'a' de "abc"."
  19812. ""
  19813. "Si se produce un error de conversión, strtod() devuelve HUGH_VAL para"
  19814. "desbordamiento por arriba (overflow) o HUGN_VAL para desbordamiento"
  19815. "por abajo (underflow). Si no se produce la conversión se devuelve 0."
  19816. ""
  19817. "La cadena debe tener el siguiente formato:"
  19818. ""
  19819. "  [sb] [sn] [ddd] [.] [ddd] [fmt[sn]ddd]"
  19820. "                          ══╗"
  19821. "  sb   =  espacios en blanco║"
  19822. "  sn   =  signo (+ o -)     ║   Todos los elementos"
  19823. "  ddd  =  dígitos           ╟─  que están entre []"
  19824. "  fmt  =  e o E             ║   son opcionales"
  19825. "   .   =  punto decimal     ║"
  19826. "                          ══╝"
  19827. ""
  19828. "Ejemplo:"
  19829. ""
  19830. "  #include <stdio.h>"
  19831. "  #include <stdlib.h>"
  19832. ""
  19833. "  int main (void)"
  19834. "  {"
  19835. "    char entrada[80], *ptrfinal;"
  19836. "    double valor;"
  19837. ""
  19838. "    printf ("Entra un número en coma flotante: ");"
  19839. "    gets (entrada);"
  19840. "    valor = strtod (entrada, &ptrfinal);"
  19841. "    printf ("El string es %s y el número es %lf\n", entrada, valor);"
  19842. "    return 0;"
  19843. "  }"
  19844. ""
  19845. ""
  19846. " ▄▄▄▄▄▄▄▄"
  19847. " ▌strtol▐   Conviete cadena a long usando la base fijada."
  19848. " ▀▀▀▀▀▀▀▀"
  19849. ""
  19850. " Sintaxis:"
  19851. "   long strtol (const char *inic, char **final, int radix);"
  19852. ""
  19853. "La función strtol() convierte la representación en cadena de caracteres"
  19854. "de un número (almacenada en la cadena apuntada por inic) en un número de"
  19855. "tipo long int y devuelve el resultado. La base del número está determi-"
  19856. "nada por radix. Si radix es 0, la base viene determinada por las reglas"
  19857. "que gobiernan la especificación de constantes. Si radix es distinto de"
  19858. "0, debe estar en el rando de 2 a 36."
  19859. ""
  19860. "La función strtol() trabaja de la siguiente forma. Primero, elimina"
  19861. "cualquier espacio en blanco de la cadena apuntada por inic. A conti-"
  19862. "nuación, se lee cada uno de los caracteres que constituyen el número."
  19863. "Cualquier carácter que no pueda formar parte de un número de tipo long"
  19864. "int finaliza el proceso. Finalmente, fin se deja apuntando al resto,"
  19865. "si lo hay, de la cadena original. Esto supone que si strtol() se llama"
  19866. "con "100abc", se devuelve el valor 100L y fin apunta al carácter 'a' de"
  19867. "la cadena "abc"."
  19868. ""
  19869. "Si se produce un error de conversión, strtol() devuelve LONG_MAX en caso"
  19870. "de desbordamiento por arriba o LONG_MIN en caso de desbordamiento por"
  19871. "abajo. Si no se produce la conversión, se devuelve 0."
  19872. ""
  19873. "La cadena debe tener el siguiente formato:"
  19874. ""
  19875. "  [sb] [sn] [0] [x] [ddd]"
  19876. ""
  19877. "                          ══╗"
  19878. "  sb   =  espacios en blanco║   Todos los elementos"
  19879. "  sn   =  signo (+ o -)     ╟─  que están entre []"
  19880. "  ddd  =  dígitos           ║   son opcionales"
  19881. "                          ══╝"
  19882. ""
  19883. "Ejemplo:"
  19884. ""
  19885. "  #include <stdlib.h>"
  19886. "  #include <stdio.h>"
  19887. ""
  19888. "  int main (void)"
  19889. "  {"
  19890. "    char *cadena = "87654321", *ptrfinal;"
  19891. "    long numero_long;"
  19892. ""
  19893. "    numero_long = strtol (cadena, &ptrfinal, 10);"
  19894. "    printf ("cadena = %s  long = %ld\n", cadena, numero_long);"
  19895. ""
  19896. "    return 0;"
  19897. "  }"
  19898. ""
  19899. ""
  19900. " ▄▄▄▄▄▄▄▄▄"
  19901. " ▌strtoul▐   Convierte una cadena a un unsigned long con la base fijada."
  19902. " ▀▀▀▀▀▀▀▀▀"
  19903. ""
  19904. " Sintaxis:"
  19905. "   unsigned long strtoul (const char *inic, char **final, int radix);"
  19906. ""
  19907. "La función strtoul() convierte la representación de la cadena de un número"
  19908. "almacenada en la cadena apuntada por inic en un unsigned long int y devuelve"
  19909. "el resultado. La base del número está determinada por radix. Si radix es 0,"
  19910. "la base viene determinada por la regla que gobierna la especificación de"
  19911. "constantes. Si radix está especificada, debe tener un valor en el rango de"
  19912. "2 a 36."
  19913. ""
  19914. "La función strtoul() trabaja de la siguiente forma. Primero, cualquier"
  19915. "espacio en blanco en la cadena apuntada por inic es eliminado. A con-"
  19916. "tinuación, se lee cada carácter que constituye el número. Cualquier"
  19917. "carácter que no pueda formar parte de un unsigned long int da lugar"
  19918. "a que el proceso se detenga. Esto incluye espacios en blanco, signos"
  19919. "de puntuación y caracteres. Finalmente, fin se deja apuntando al resto,"
  19920. "si lo hay, de la cadena original. Esto supone que si strtoul() se llama"
  19921. "con "100abc", el valor que se devuelve es 100L y fin apunta a la 'a' de"
  19922. ""abc"."
  19923. ""
  19924. "Si se produce un error de conversión, strtoul() devuelve ULONG_MAX para el"
  19925. "desbordamiento por encima o ULONG_MIN para desbordamiento por abajo. Si la"
  19926. "conversión no tiene lugar se devuelve 0."
  19927. ""
  19928. "Ejemplo:"
  19929. ""
  19930. "  #include <stdlib.h>"
  19931. "  #include <stdio.h>"
  19932. ""
  19933. "  int main (void)"
  19934. "  {"
  19935. "    char *cadena = "87654321", *ptrfinal;"
  19936. "    unsigned long numero_long_unsigned;"
  19937. ""
  19938. "    numero_long_unsigned = strtoul (cadena, &ptrfinal, 10);"
  19939. "    printf ("cadena = %s  long = %lu\n", cadena, numero_long_unsigned);"
  19940. ""
  19941. "    return 0;"
  19942. "  }"
  19943. ""
  19944. ""
  19945. begint
  19946. " ▄▄▄▄▄▄"
  19947. " ▌swab▐   (TC) Intercambia bytes."
  19948. " ▀▀▀▀▀▀"
  19949. ""
  19950. " Sintaxis:"
  19951. "   void swab (char *fuente, char *destino, int nbytes);"
  19952. ""
  19953. "Copia nbytes bytes de fuente a destino intercambiando cada par de bytes"
  19954. "adyacentes durante la transferencia."
  19955. ""
  19956. "  fuente[0] = destino[1]"
  19957. "  fuente[1] = destino[0]"
  19958. "        ..."
  19959. ""
  19960. "nbytes debería ser un número par."
  19961. ""
  19962. "Ejemplo:"
  19963. ""
  19964. "  /* Este programa imprime: «Este es destino: Frank Borland» */"
  19965. ""
  19966. "  #include <stdlib.h>"
  19967. "  #include <stdio.h>"
  19968. "  #include <string.h>"
  19969. ""
  19970. "  char fuente[15] = "rFna koBlrna d";"
  19971. "  char destino[15];"
  19972. ""
  19973. "  int main (void)"
  19974. "  {"
  19975. "    swab (fuente, destino, strlen (fuente));"
  19976. "    printf ("Este es destino: %s\n", destino);"
  19977. "    return 0;"
  19978. "  }"
  19979. ""
  19980. ""
  19981. endt
  19982. " ▄▄▄▄▄▄▄▄"
  19983. " ▌system▐   Ejecuta un comando DOS."
  19984. " ▀▀▀▀▀▀▀▀"
  19985. ""
  19986. " Sintaxis:"
  19987. "   int system (const char *comando);"
  19988. ""
  19989. "El prototipo de esta función también se encuentra en el fichero stdlib.h."
  19990. ""
  19991. "comando puede ejecutar un comando interno del DOS tales como DIR, un fichero"
  19992. "de programa .COM o .EXE, o un fichero batch .BAT."
  19993. ""
  19994. "Devuelve 0 en caso de éxito, -1 en caso de error y se le asigna a errno uno"
  19995. "de los siguientes valores: ENOENT, ENOMEM, E2BIG o ENOEXEC."
  19996. ""
  19997. "La función system() también se encuentra declarada en los ficheros process.h"
  19998. "y system.h. En el fichero system.h sólo se encuentra el prototipo de la"
  19999. "función system()."
  20000. ""
  20001. "Ejemplo:"
  20002. ""
  20003. "  #include <stdlib.h>"
  20004. ""
  20005. "  void main (void)"
  20006. "  {"
  20007. "    system ("dir");"
  20008. "  }"
  20009. begint
  20010. ""
  20011. ""
  20012. " ▄▄▄▄▄▄▄"
  20013. " ▌ultoa▐   (TC) Convierte un unsigned long a una cadena."
  20014. " ▀▀▀▀▀▀▀"
  20015. ""
  20016. " Sintaxis:"
  20017. "   char *ultoa (unsigned long valor, char *cadena, int radix);"
  20018. ""
  20019. "Devuelve un puntero a la cadena. No devuelve error."
  20020. ""
  20021. "Ejemplo:"
  20022. ""
  20023. "  #include <stdlib.h>"
  20024. "  #include <stdio.h>"
  20025. ""
  20026. "  int main (void)"
  20027. "  {"
  20028. "    unsigned long numero_unsigned_long = 3123456789L;"
  20029. "    char cadena[25];"
  20030. ""
  20031. "    ultoa (numero_unsigned_long, cadena, 10);"
  20032. "    printf ("cadena = %s  unsigned long = %lu\n","
  20033. "            cadena, numero_unsigned_long);"
  20034. ""
  20035. "    return 0;"
  20036. "  }"
  20037. endt
  20038. ""
  20039. ""
  20040. "CONSTANTES, TIPOS DE DATOS, Y VARIABLES GLOBALES:"
  20041. "*************************************************"
  20042. ""
  20043. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  20044. "  div_t (tipo)"
  20045. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  20046. ""
  20047. "Tipo devuelto por la división entera."
  20048. ""
  20049. "  typedef struct { int quot, rem; } div_t;"
  20050. ""
  20051. ""
  20052. begint
  20053. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  20054. "  _doserrno (variable global)   (TC)"
  20055. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  20056. ""
  20057. "Variable que indica el código de error del DOS actual."
  20058. ""
  20059. "  int _doserrno;"
  20060. ""
  20061. "Cuando en una llamada al sistema MS-DOS ocurre un error, a _doserrno se"
  20062. "le asigna el código de error DOS actual."
  20063. ""
  20064. "Los mnemotécnicos para los códigos de error de DOS actual que pueden ser"
  20065. "asignados a _doserrno son:"
  20066. ""
  20067. " Mnemotécnico │ Código de error del DOS."
  20068. " ═════════════╪══════════════════════════════"
  20069. "    E2BIG     │ Entorno malo"
  20070. "    EACCES    │ Acceso denegado"
  20071. "    EACCES    │ Acceso malo"
  20072. "    EACCES    │ Es directorio corriente"
  20073. "    EBADF     │ Manejador malo"
  20074. "    EFAULT    │ Reservado"
  20075. "    EINVAL    │ Datos malos"
  20076. "    EINVAL    │ Función mala"
  20077. "    EMFILE    │ Demasiados ficheros abiertos"
  20078. "    ENOENT    │ No es fichero ni directorio"
  20079. "    ENOEXEC   │ Formato malo"
  20080. "    ENOMEM    │ MCB destruido"
  20081. "    ENOMEM    │ Fuera de memoria"
  20082. "    ENOMEM    │ Bloque malo"
  20083. "    EXDEV     │ Unidad mala"
  20084. "    EXDEV     │ No es el mismo dispositivo"
  20085. ""
  20086. "Esta variable también está declarada en los ficheros errno.h y dos.h."
  20087. ""
  20088. ""
  20089. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  20090. "  environ (variable global)    (TC)"
  20091. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  20092. ""
  20093. "Array de cadenas usado para acceder y alterar el entorno del proceso."
  20094. ""
  20095. "  extern char **environ"
  20096. ""
  20097. "También se encuentra declarada en el fichero dos.h."
  20098. ""
  20099. ""
  20100. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  20101. "  errno (global variable)   (TC)"
  20102. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  20103. ""
  20104. "Variable que indica el tipo de error."
  20105. ""
  20106. "  int errno;"
  20107. ""
  20108. "Siempre que ocurre un error en una llamada al sistema, a errno se le"
  20109. "asigna un código de error que indica el tipo de error ocurrido."
  20110. ""
  20111. "En Turbo C, definido también en los ficheros errno.h y stddef.h."
  20112. ""
  20113. ""
  20114. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  20115. "  EXIT_xxxx (#defines)   (TC)"
  20116. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  20117. ""
  20118. "Constantes que definen condiciones de salida para las llamadas a la"
  20119. "función exit()."
  20120. ""
  20121. "  EXIT_SUCCESS   Terminación normal de un programa."
  20122. "  EXIT_FAILURE   Terminación anormal de un programa."
  20123. ""
  20124. ""
  20125. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  20126. "  _fmode (variable global)    (TC)"
  20127. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  20128. ""
  20129. "Modo por defecto de traslación de fichero."
  20130. ""
  20131. "  int _fmode;"
  20132. ""
  20133. "Al comienzo tiene el valor de O_TEXT por defecto."
  20134. ""
  20135. "Definida también en el fichero fcntl.h."
  20136. ""
  20137. ""
  20138. endt
  20139. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  20140. "  ldiv_t (type)"
  20141. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  20142. ""
  20143. "Tipo devuelto por la división de enteros largos."
  20144. ""
  20145. "  typedef struct { long quot, rem; } ldiv_t;"
  20146. ""
  20147. ""
  20148. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  20149. "  NULL (#define)"
  20150. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  20151. ""
  20152. "Valor de puntero nulo."
  20153. begint
  20154. ""
  20155. "En Turbo C, definido también en los ficheros alloc.h, mem.h, stddef.h y"
  20156. "stdio.h."
  20157. endt
  20158. ""
  20159. ""
  20160. begint
  20161. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  20162. "  _psp (variable global)   (TC)"
  20163. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  20164. ""
  20165. "Dirección del segmento del PSP (Prefijo de Segmento de Programa) del"
  20166. "programa."
  20167. ""
  20168. "  extern unsigned int _psp;"
  20169. ""
  20170. "También está declarada en los ficheros process.h y dos.h."
  20171. ""
  20172. ""
  20173. endt
  20174. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  20175. "  RAND_MAX (#define)"
  20176. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  20177. ""
  20178. "Valor máximo devuelto por la función rand()."
  20179. ""
  20180. ""
  20181. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  20182. "  size_t (tipo)"
  20183. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  20184. ""
  20185. "Tipo usado para los tamaños de objeto de memoria y contadores de bucles."
  20186. begint
  20187. ""
  20188. "En Turbo C, definido también en los ficheros alloc.h, mem.h, stddef.h,"
  20189. "stdio.h y string.h."
  20190. endt
  20191. ""
  20192. ""
  20193. begint
  20194. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  20195. "  sys_errlist (variable global)    (TC)"
  20196. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  20197. ""
  20198. "Array de cadenas de mensajes."
  20199. ""
  20200. "  char *sys_errlist[]"
  20201. ""
  20202. "Esta variable es un array de cadenas de mensajes que corresponden a errno"
  20203. "y es usada por la función perror()."
  20204. ""
  20205. "Los mnemotécnicos y sus significados para los valores almacenados en"
  20206. "sys_errlist son:"
  20207. ""
  20208. " Mnemotécnico│ Significado"
  20209. " ════════════╪═════════════════════════════════════════"
  20210. "    E2BIG    │ Lista de argumentos demasiado larga"
  20211. "    EACCES   │ Permiso denegado"
  20212. "    EBADF    │ Número malo de fichero"
  20213. "    ECONTR   │ Bloques de memoria destruidos"
  20214. "    ECURDIR  │ Intento de quitar el directorio actual"
  20215. "    EDOM     │ Error de dominio"
  20216. "    EEXIST   │ El fichero ya existe"
  20217. "    EFAULT   │ Error desconocido"
  20218. "    EINVACC  │ Código de acceso no válido"
  20219. "    EINVAL   │ Argumento no válido"
  20220. "    EINVDAT  │ Datos no válidos"
  20221. "    EINVDRV  │ Unidad especificada no válida"
  20222. "    EINVENV  │ Entorno no válido"
  20223. "    EINVFMT  │ Formato no válido"
  20224. "    EINVFNC  │ Número de función no válido"
  20225. "    EINVMEM  │ Dirección de bloque de memoria no válido"
  20226. "    EMFILE   │ Demasiados ficheros abiertos"
  20227. "    ENMFILE  │ No más ficheros"
  20228. "    ENODEV   │ No como dispositivo"
  20229. "    ENOENT   │ No como fichero o directorio"
  20230. "    ENOEXEC  │ Error de formato de exec"
  20231. "    ENOFILE  │ No como fichero o directorio"
  20232. "    ENOMEM   │ No hay suficiente memoria"
  20233. "    ENOPATH  │ Path no encontrado"
  20234. "    ENOTSAM  │ No es el mismo dispositivo"
  20235. "    ERANGE   │ Resultado fuera de ranto"
  20236. "    EXDEV    │ Cross-device link"
  20237. "    EZERO    │ Error 0"
  20238. ""
  20239. ""
  20240. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  20241. "  sys_nerr (variable global)   (TC)"
  20242. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  20243. ""
  20244. "Número de cademas de mensajes de error."
  20245. ""
  20246. "  int sys_nerr;"
  20247. ""
  20248. "Esta variable contiene el número de cadenas de mensajes de error en"
  20249. "sys_errlist."
  20250. ""
  20251. endt
  20252. ""
  20253. endvis
  20254. beginv
  20255. cabecera " FUNCIONES DE HORA Y FECHA "
  20256. color 15 3
  20257. centrar_coordenadas
  20258. borde 2
  20259. ""
  20260. "  El estándar ANSI define varias funciones que utilizan la fecha y hora"
  20261. "  del sistema al igual que el tiempo transcurrido. Estas funciones re-"
  20262. "  quieren la cabecera ~<time.h>~ en la declaración de funciones y también"
  20263. "  define algunos tipos. Los tipos ~clock_t~ y ~time_t~ permiten representar"
  20264. "  la hora y fecha del sistema como un entero extendido. El estándar ANSI  "
  20265. "  se refiere a este tipo de representación como hora de calendario. El"
  20266. "  tipo de estructura ~tm~ mantiene la fecha y la hora separada en sus com-"
  20267. "  ponentes. Además, time.h define la macro ~CLK_TCK~ que es el número de"
  20268. "  pulsos de reloj del sistema por segundo."
  20269. ""
  20270. endv
  20271. borrar_pantalla
  20272. beginvis
  20273. no_multiatributo
  20274. cabecera " FICHERO DE CABECERA TIME.H "
  20275. coordenadas_completas 1 2 80 24
  20276. color 0 3
  20277. borde 2
  20278. "GLOSARIO:"
  20279. "*********"
  20280. ""
  20281. " ▄▄▄▄▄▄▄▄▄"
  20282. " ▌asctime▐   Convierte fecha y hora a ASCII."
  20283. " ▀▀▀▀▀▀▀▀▀"
  20284. " ▄▄▄▄▄▄▄"
  20285. " ▌clock▐   Devuelve el número de pulsos de reloj desde el comienzo del"
  20286. " ▀▀▀▀▀▀▀   programa."
  20287. " ▄▄▄▄▄▄▄"
  20288. " ▌ctime▐   Convierte fecha y hora a una cadena."
  20289. " ▀▀▀▀▀▀▀"
  20290. " ▄▄▄▄▄▄▄▄▄▄"
  20291. " ▌difftime▐   Calcula la diferencia entre dos horas."
  20292. " ▀▀▀▀▀▀▀▀▀▀"
  20293. " ▄▄▄▄▄▄▄▄"
  20294. " ▌gmtime▐   Convierte fecha y hora a hora de Greenwich."
  20295. " ▀▀▀▀▀▀▀▀"
  20296. " ▄▄▄▄▄▄▄▄▄▄▄"
  20297. " ▌localtime▐   Convierte fecha y hora a una estructura."
  20298. " ▀▀▀▀▀▀▀▀▀▀▀"
  20299. " ▄▄▄▄▄▄▄▄"
  20300. " ▌mktime▐   Convierte hora a formato de calendario."
  20301. " ▀▀▀▀▀▀▀▀"
  20302. begint
  20303. " ▄▄▄▄▄▄▄"
  20304. " ▌stime▐   (TC) Pone fecha y hora del sistema."
  20305. " ▀▀▀▀▀▀▀"
  20306. endt
  20307. " ▄▄▄▄▄▄▄▄▄▄"
  20308. " ▌strftime▐   Formatea hora para salida."
  20309. " ▀▀▀▀▀▀▀▀▀▀"
  20310. " ▄▄▄▄▄▄"
  20311. " ▌time▐   Obtiene la hora actual."
  20312. " ▀▀▀▀▀▀"
  20313. begint
  20314. " ▄▄▄▄▄▄▄"
  20315. " ▌tzset▐   (TC) Para compatibilidad con hora de UNIX; da valores a las"
  20316. " ▀▀▀▀▀▀▀   variables globales daylight, timezone y tzname."
  20317. endt
  20318. ""
  20319. ""
  20320. "FUNCIONES:"
  20321. "**********"
  20322. ""
  20323. " ▄▄▄▄▄▄▄▄▄"
  20324. " ▌asctime▐   Convierte fecha y hora a ASCII."
  20325. " ▀▀▀▀▀▀▀▀▀"
  20326. ""
  20327. " Sintaxis:"
  20328. "   char *asctime (const struct tm *punt);"
  20329. ""
  20330. "La función asctime() devuelve un puntero a una cadena que convierte la"
  20331. "información almacenada en la estructura apuntada por punt de la siguiente"
  20332. "forma:"
  20333. ""
  20334. " nombre_de_dia nombre_del_mes dia_del_mes horas:minutos:segundos año\n\0"
  20335. ""
  20336. "El puntero a estructura pasado a asctime() se obtiene normalmente de"
  20337. "localtime() o gmtime()."
  20338. ""
  20339. "El buffer utilizado por asctime() para mantener la cadena de salida con"
  20340. "formato se sitúa estáticamente en un array de caracteres y se sobreescribe"
  20341. "cada vez que se llama a la función. Si se desea salvar el contenido de la"
  20342. "cadena, es necesario copiarlo en otro lugar."
  20343. ""
  20344. "Ejemplo:"
  20345. ""
  20346. "  #include <stdio.h>"
  20347. "  #include <string.h>"
  20348. "  #include <time.h>"
  20349. ""
  20350. "  int main (void)"
  20351. "  {"
  20352. "    struct tm t;"
  20353. "    char str[80];"
  20354. ""
  20355. "    t.tm_sec    = 1;  /* Segundos */"
  20356. "    t.tm_min    = 30; /* Minutos */"
  20357. "    t.tm_hour   = 9;  /* Hora */"
  20358. "    t.tm_mday   = 22; /* Día del mes */"
  20359. "    t.tm_mon    = 11; /* Mes */"
  20360. "    t.tm_year   = 56; /* Año - no incluye centenas */"
  20361. "    t.tm_wday   = 4;  /* Día de la semana */"
  20362. "    t.tm_yday   = 0;  /* No mostrado en asctime */"
  20363. "    t.tm_isdst  = 0;  /* Es horario de verano; no mostrado en asctime */"
  20364. ""
  20365. "    strcpy (str, asctime (&t));"
  20366. "    printf ("%s\n", str);"
  20367. ""
  20368. "    return 0;"
  20369. "  }"
  20370. ""
  20371. ""
  20372. " ▄▄▄▄▄▄▄"
  20373. " ▌clock▐   Devuelve el número de pulsos de reloj desde el comienzo del"
  20374. " ▀▀▀▀▀▀▀   programa."
  20375. ""
  20376. " Sintaxis:"
  20377. "   clock_t clock (void);"
  20378. ""
  20379. "Devuelve el tiempo de procesador usado desde el comienzo de la ejecución"
  20380. "del programa medido en pulsos de reloj. Para transformar este valor en"
  20381. "segundos, se divide entre CLK_TCK. Se devuelve el valor -1 si el tiempo"
  20382. "no está disponible."
  20383. ""
  20384. "Ejemplo:"
  20385. ""
  20386. "  #include <time.h>"
  20387. "  #include <stdio.h>"
  20388. "  #include <dos.h>"
  20389. ""
  20390. "  int main (void)"
  20391. "  {"
  20392. "    clock_t comienzo, final;"
  20393. ""
  20394. "    comienzo = clock ();"
  20395. ""
  20396. "    delay (2000);"
  20397. ""
  20398. "    final = clock ();"
  20399. ""
  20400. "    printf ("El tiempo transcurrido ha sido: %f segundos.\n","
  20401. "            (final - comienzo) / CLK_TCK);"
  20402. ""
  20403. "    return 0;"
  20404. "  }"
  20405. ""
  20406. ""
  20407. " ▄▄▄▄▄▄▄"
  20408. " ▌ctime▐   Convierte fecha y hora a una cadena."
  20409. " ▀▀▀▀▀▀▀"
  20410. ""
  20411. " Sintaxis:"
  20412. "   char *ctime (const time_t *time);"
  20413. ""
  20414. "Esta función es equivalente a:"
  20415. "   asctime (localtime (hora));"
  20416. ""
  20417. "Ejemplo:"
  20418. ""
  20419. "  #include <stdio.h>"
  20420. "  #include <time.h>"
  20421. ""
  20422. "  int main (void)"
  20423. "  {"
  20424. "    time_t t;"
  20425. ""
  20426. "    time (&t);"
  20427. "    printf ("La fecha y hora de hoy es: %s\n", ctime(&t));"
  20428. "    return 0;"
  20429. "  }"
  20430. ""
  20431. ""
  20432. " ▄▄▄▄▄▄▄▄▄▄"
  20433. " ▌difftime▐   Calcula la diferencia entre dos horas."
  20434. " ▀▀▀▀▀▀▀▀▀▀"
  20435. ""
  20436. " Sintaxis:"
  20437. "   double difftime (time_t hora2, time_t hora1);"
  20438. ""
  20439. "Devuelve la diferencia, en segundos, entre hora1 y hora2. Es decir"
  20440. "hora2-hora1."
  20441. ""
  20442. "Ejemplo:"
  20443. ""
  20444. "  #include <time.h>"
  20445. "  #include <stdio.h>"
  20446. "  #include <dos.h>"
  20447. ""
  20448. "  int main (void)"
  20449. "  {"
  20450. "    time_t primero, segundo;"
  20451. ""
  20452. "    primero = time (NULL); /* Obtiene hora del sistema */"
  20453. "    delay (2000); /* Espera 2 segundos */"
  20454. "    segundo = time (NULL); /* Obtiene otra vez la hora del sistema */"
  20455. ""
  20456. "    printf ("La diferencia es: %f segundos\n", difftime (segundo, primero));"
  20457. ""
  20458. "    return 0;"
  20459. "  }"
  20460. ""
  20461. ""
  20462. " ▄▄▄▄▄▄▄▄"
  20463. " ▌gmtime▐   Convierte fecha y hora a hora de Greenwich."
  20464. " ▀▀▀▀▀▀▀▀"
  20465. ""
  20466. " Sintaxis:"
  20467. "   struct tm *gmtime (const time_t *hora);"
  20468. ""
  20469. "La función gmtime() devuelve un puntero a la forma de hora en una estructura"
  20470. "tm. La hora está representada en hora de Greenwich. El valor de hora se ob-"
  20471. "tiene normalmente a través de una llamada a time()."
  20472. ""
  20473. "La estructura utilizada por gmtime() mantiene la hora separada en una posi-"
  20474. "ción estática y se sobreescribe en ella cada vez que se llama a la función."
  20475. "Si se desea guardar el contenido de la estructura, es necesario copiarlo a"
  20476. "otro lugar."
  20477. ""
  20478. "Ejemplo:"
  20479. ""
  20480. "  #include <stdio.h>"
  20481. "  #include <time.h>"
  20482. ""
  20483. "  int main (void)"
  20484. "  {"
  20485. "    struct tm *local, *gm;"
  20486. "    time_t t;"
  20487. ""
  20488. "    t = time (NULL);"
  20489. "    local = localtime (&t);"
  20490. "    printf ("Hora y fecha local: %s", asctime (local));"
  20491. "    gm = gmtime (&t);"
  20492. "    printf ("Hora y fecha según Greenwich: %s", asctime (gm));"
  20493. ""
  20494. "    return 0;"
  20495. "  }"
  20496. ""
  20497. ""
  20498. " ▄▄▄▄▄▄▄▄▄▄▄"
  20499. " ▌localtime▐   Convierte fecha y hora a una estructura."
  20500. " ▀▀▀▀▀▀▀▀▀▀▀"
  20501. ""
  20502. " Sintaxis:"
  20503. "   struct tm *localtime (const time_t *hora);"
  20504. ""
  20505. "La función localtime() devuelve un puntero a la forma esperada de hora en"
  20506. "la estructura tm. La hora se representa en la hora local. El valor hora se"
  20507. "obtiene normalmente a través de una llamada a time()."
  20508. ""
  20509. "La estructura utilizada por localtime() para mantener la hora separada está"
  20510. "situada de forma estática y se reescribe cada vez que se llama a la función."
  20511. "Si se desea guardar el contenido de la estructura, es necesario copiarla en"
  20512. "otro lugar."
  20513. ""
  20514. "Ejemplo:"
  20515. ""
  20516. "  #include <time.h>"
  20517. "  #include <stdio.h>"
  20518. ""
  20519. "  int main (void)"
  20520. "  {"
  20521. "    time_t hora;"
  20522. "    struct tm *bloquet;"
  20523. ""
  20524. "    /* obtiene hora actual */"
  20525. "    hora = time (NULL);"
  20526. ""
  20527. "    /* convierte fecha/hora a una estructura */"
  20528. "    bloquet = localtime (&hora);"
  20529. ""
  20530. "    printf ("La hora local es: %s", asctime (bloquet));"
  20531. ""
  20532. "    return 0;"
  20533. "  }"
  20534. ""
  20535. ""
  20536. " ▄▄▄▄▄▄▄▄"
  20537. " ▌mktime▐   Convierte hora a formato de calendario."
  20538. " ▀▀▀▀▀▀▀▀"
  20539. ""
  20540. " Sintaxis:"
  20541. "   time_t mktime (struct tm *t);"
  20542. ""
  20543. "La función mktime() devuelve la hora de calendario equivalente a la hora"
  20544. "separada que se encuentra en la estructura apuntada por hora. Esta función"
  20545. "se utiliza principalmente para inicializar el sistema. Los elementos tm_wday"
  20546. "y tm_yday son activados por la función, de modo que no necesitan ser defini-"
  20547. "dos en el momento de la llamada."
  20548. ""
  20549. "Si mktime() no puede representar la información como una hora de calendario"
  20550. "válida, se devuelve -1."
  20551. ""
  20552. "Ejemplo:"
  20553. ""
  20554. "  #include <stdio.h>"
  20555. "  #include <time.h>"
  20556. ""
  20557. "  char *dia_semana[] = { "Domingo", "Lunes", "Martes", "Miércoles","
  20558. "                         "Jueves", "Viernes", "Sábado", "Desconocido" };"
  20559. ""
  20560. "  int main (void)"
  20561. "  {"
  20562. "    struct tm chequeo_de_hora;"
  20563. "    int anio, mes, dia;"
  20564. ""
  20565. "    /* lee dia, mes y anio para encontrar el día de la semana */"
  20566. "    printf ("Día:   ");"
  20567. "    scanf ("%d", &dia);"
  20568. "    printf ("Mes: ");"
  20569. "    scanf ("%d", &mes);"
  20570. "    printf ("Año:  ");"
  20571. "    scanf ("%d", &anio);"
  20572. ""
  20573. "    /* carga la estructura chequeo_de_hora con los datos */"
  20574. "    chequeo_de_hora.tm_year = anio - 1900;"
  20575. "    chequeo_de_hora.tm_mon  = mes - 1;"
  20576. "    chequeo_de_hora.tm_mday = dia;"
  20577. "    chequeo_de_hora.tm_hour = 0;"
  20578. "    chequeo_de_hora.tm_min  = 0;"
  20579. "    chequeo_de_hora.tm_sec  = 1;"
  20580. "    chequeo_de_hora.tm_isdst = -1;"
  20581. ""
  20582. "    /* llama a mktime() para rellenear el campo weekday de la estructura */"
  20583. "    if (mktime (&chequeo_de_hora) == -1)"
  20584. "      chequeo_de_hora.tm_wday = 7;"
  20585. ""
  20586. "    /* imprime el día de la semana */"
  20587. "    printf ("Este día es %s\n", dia_semana [chequeo_de_hora.tm_wday]);"
  20588. ""
  20589. "    return 0;"
  20590. "  }"
  20591. ""
  20592. ""
  20593. begint
  20594. " ▄▄▄▄▄▄▄"
  20595. " ▌stime▐   (TC) Pone fecha y hora del sistema."
  20596. " ▀▀▀▀▀▀▀"
  20597. ""
  20598. " Sintaxis:"
  20599. "   int stime (time_t *pt);"
  20600. ""
  20601. "Devuelve el valor 0."
  20602. ""
  20603. "Ejemplo:"
  20604. ""
  20605. "  #include <stdio.h>"
  20606. "  #include <time.h>"
  20607. ""
  20608. "  int main (void)"
  20609. "  {"
  20610. "    time_t t;"
  20611. ""
  20612. "    t = time (NULL);"
  20613. "    printf ("Número de segundos desde 1-1-1970: %ld\n", t);"
  20614. "    printf ("Hora local: %s", asctime (localtime (&t)));"
  20615. ""
  20616. "    t++;"
  20617. "    printf ("Añadido un segundo: %s", asctime (localtime (&t)));"
  20618. ""
  20619. "    t += 60;"
  20620. "    printf ("Añadido un minuto : %s", asctime (localtime (&t)));"
  20621. ""
  20622. "    t += 3600;"
  20623. "    printf ("Añadido una hora  : %s", asctime (localtime (&t)));"
  20624. ""
  20625. "    t += 86400L;"
  20626. "    printf ("Añadido un día    : %s", asctime (localtime (&t)));"
  20627. ""
  20628. "    t += 2592000L;"
  20629. "    printf ("Añadido un mes    : %s", asctime (localtime (&t)));"
  20630. ""
  20631. "    t += 31536000L;"
  20632. "    printf ("Añadido un año    : %s", asctime (localtime (&t)));"
  20633. ""
  20634. "    return 0;"
  20635. "  }"
  20636. ""
  20637. ""
  20638. endt
  20639. " ▄▄▄▄▄▄▄▄▄▄"
  20640. " ▌strftime▐   Formatea hora para salida."
  20641. " ▀▀▀▀▀▀▀▀▀▀"
  20642. ""
  20643. " Sintaxis:"
  20644. "   size_t strftime (char *cad, size_t maxtam, const char *fmt,"
  20645. "                    const struct tm *t);"
  20646. ""
  20647. "La función strftime() sitúa la hora y la fecha (junto con otra información)"
  20648. "en la cadena apuntada por cad. La información se sitúa de acuerdo a las ór-"
  20649. "denes de formato que se encuentran en la cadena apuntada por fmt y en la"
  20650. "forma de hora separada t. Se sitúan un máximo de maxtam caracteres en cad."
  20651. ""
  20652. "La función strftime() trabaja de forma algo parecida a sprintf() en el que"
  20653. "se reconoce un conjunto de órdenes de formato que comienzan con el signo de"
  20654. "porcentaje (%) y sitúa su salida con formato en una cadena. Las órdenes de"
  20655. "formato se utilizan para especificar la forma exacta en que se representan"
  20656. "diferentes informaciones de hora y fecha en cad. Cualquier otro carácter"
  20657. "que se encuentre en la cadena de formato se pone en cad sin modificar. La"
  20658. "hora y fecha presentadas están en hora local. Las órdenes de formato se"
  20659. "presentan en la siguiente tabla. Observa que muchas órdenes distinguen"
  20660. "entre mayúsculas y minúsculas."
  20661. ""
  20662. "La función strftime() devuelve el número de caracteres situados en la cadena"
  20663. "apuntada por cad. Si se produce un error, la función devuelve 0."
  20664. ""
  20665. "   Orden    Substituida por"
  20666. "   -----  --------------------------------------------"
  20667. "    %a     Día de la semana en abreviatura"
  20668. "    %A     Día de la semana completo"
  20669. "    %b     Abreviatura del mes"
  20670. "    %B     Nombre del mes completo"
  20671. "    %c     Cadena de hora y fecha estándar"
  20672. "    %d     Día del mes en número (1-31)"
  20673. "    %H     Hora, rango (0-23)"
  20674. "    %I     Hora, rango (1-12)"
  20675. "    %j     Día del año en número (1-366)"
  20676. "    %m     Mes en número (1-12)"
  20677. "    %M     Minuto en número (0-59)"
  20678. "    %p     Equivalencia de lugar de AM y PM"
  20679. "    %S     Segundos en número (0-59)"
  20680. "    %U     Semana del año, domingo primer día (0-52)"
  20681. "    %w     Día de la semana (0-6, domingo provoca 0)"
  20682. "    %W     Semana del año, lunes primer día (0-52)"
  20683. "    %x     Cadena de fecha estándar"
  20684. "    %X     Cadena de hora estándar"
  20685. "    %y     Año en número sin centenas (00-99)"
  20686. "    %Y     Año completo en número"
  20687. "    %Z     Nombre de zona temporal"
  20688. "    %%     Signo de tanto por ciento"
  20689. ""
  20690. "Ejemplo:"
  20691. ""
  20692. "  #include <stdio.h>"
  20693. "  #include <time.h>"
  20694. ""
  20695. "  int main(void)"
  20696. "  {"
  20697. "    struct tm *hora_act;"
  20698. "    time_t segs_act;"
  20699. "    char str[80];"
  20700. ""
  20701. "    time (&segs_act);"
  20702. "    hora_act = localtime (&segs_act);"
  20703. "    strftime (str, 80, "Ahora son las %H %p del %d-%m-%y.", hora_act);"
  20704. "    printf ("%s\n", str);"
  20705. ""
  20706. "    return 0;"
  20707. "  }"
  20708. ""
  20709. ""
  20710. " ▄▄▄▄▄▄"
  20711. " ▌time▐   Obtiene la hora actual."
  20712. " ▀▀▀▀▀▀"
  20713. ""
  20714. " Sintaxis:"
  20715. "   time_t time (time_t *hora);"
  20716. ""
  20717. "La función time() devuelve la hora actual de calendario del sistema. Si el"
  20718. "sistema no tiene hora, devuelve -1."
  20719. ""
  20720. "La función time() puede llamarse con un puntero nulo o con un puntero a una"
  20721. "variable de tipo time_t. Si se utiliza este último, el argumento es también"
  20722. "asignado a la hora de calendario."
  20723. ""
  20724. "Ejemplo:"
  20725. ""
  20726. "  #include <time.h>"
  20727. "  #include <stdio.h>"
  20728. ""
  20729. "  int main (void)"
  20730. "  {"
  20731. "    time_t t;"
  20732. ""
  20733. "    t = time (NULL);"
  20734. "    printf ("El número de segundos transcurridos desde el 1 de Enero ""
  20735. "            "de 1970 es %ld", t);"
  20736. ""
  20737. "    return 0;"
  20738. "  }"
  20739. begint
  20740. ""
  20741. ""
  20742. " ▄▄▄▄▄▄▄"
  20743. " ▌tzset▐   (TC) Para compatibilidad con hora de UNIX; da valores a las"
  20744. " ▀▀▀▀▀▀▀   variables globales daylight, timezone y tzname."
  20745. ""
  20746. " Sintaxis:"
  20747. "   void tzset (void);"
  20748. ""
  20749. "tzset() espera encontrar una cadena de entorno de la forma"
  20750. ""
  20751. "  TZ=..."
  20752. ""
  20753. "que define la zona horaria."
  20754. ""
  20755. ""
  20756. "  #include <time.h>"
  20757. "  #include <stdlib.h>"
  20758. "  #include <stdio.h>"
  20759. ""
  20760. "  int main (void)"
  20761. "  {"
  20762. "    time_t td;"
  20763. ""
  20764. "    /* Pacific Standard Time & Daylight Savings */"
  20765. "    putenv ("TZ=PST8PDT");"
  20766. "    tzset ();"
  20767. "    time (&td);"
  20768. "    printf ("Hora actual = %s\n", asctime (localtime (&td)));"
  20769. ""
  20770. "    return 0;"
  20771. "  }"
  20772. endt
  20773. ""
  20774. ""
  20775. "CONSTANTES, TIPOS DE DATOS, Y VARIABLES GLOBALES:"
  20776. "*************************************************"
  20777. ""
  20778. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  20779. "  clock_t (tipo)"
  20780. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  20781. ""
  20782. "Este tipo de datos devuelto por la función clock() almacena un tiempo"
  20783. "transcurrido medido en pulsos de reloj."
  20784. ""
  20785. "La constante CLK_TCK define el número de pulsos de reloj por segundo."
  20786. ""
  20787. ""
  20788. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  20789. "  daylight (global variable)"
  20790. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  20791. ""
  20792. "Indica si se harán ajustes de horario de verano."
  20793. ""
  20794. "  int daylight;"
  20795. ""
  20796. "Las funciones de hora y fecha usan dylight."
  20797. ""
  20798. ""
  20799. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  20800. "  time_t (tipo)"
  20801. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  20802. ""
  20803. "Este tipo de variable define el valor usado por las funciones de tiempo."
  20804. begint
  20805. ""
  20806. "En Turbo C, también está declarado en sys\types.h. El fichero sys\types.h"
  20807. "únicamente contiene la declaración de este tipo."
  20808. endt
  20809. ""
  20810. ""
  20811. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  20812. "  timezone (variable global)"
  20813. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  20814. ""
  20815. "Diferencia en segundos entre hora local y hora del meridiano de Greenwich."
  20816. ""
  20817. "  extern long timezone;"
  20818. ""
  20819. "Usada por las funciones de hora y fecha."
  20820. ""
  20821. ""
  20822. " ▄▄▄▄▄▄▄▄▄▄▄▄▄"
  20823. "  TM (struct)"
  20824. " ▀▀▀▀▀▀▀▀▀▀▀▀▀"
  20825. ""
  20826. "Describe una estructura que contiene una fecha y hora separada en sus"
  20827. "componentes."
  20828. ""
  20829. "  struct tm"
  20830. "    {"
  20831. "      int tm_sec;   /* segundos, 0-59                     */"
  20832. "      int tm_min;   /* minutos, 0-59                      */"
  20833. "      int tm_hour;  /* horas, 0-23                        */"
  20834. "      int tm_mday;  /* día del mes, 1-31                  */"
  20835. "      int tm_mon;   /* mes, 0-11, Enero = 0               */"
  20836. "      int tm_year;  /* año, año actual menos 1900         */"
  20837. "      int tm_wday;  /* día de la semana, 0-6, Domingo = 0 */"
  20838. "      int tm_yday;  /* día del año, 0-365, 1 de Enero = 0 */"
  20839. "      int tm_isdst; /* indicador de horario de verano     */"
  20840. "    };"
  20841. begint
  20842. ""
  20843. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  20844. "  tzname (variable global)   (TC)"
  20845. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  20846. ""
  20847. "Array de punteros a cadenas."
  20848. ""
  20849. "  extern char * tzname[2]"
  20850. ""
  20851. "NOTA: esta variable está declarada en el fichero io.h, no en éste (time.h)."
  20852. ""
  20853. "Un array de punteros a cadenas conteniendo las abreviaciones para los"
  20854. "nombres de zonas horarias."
  20855. endt
  20856. ""
  20857. endvis
  20858. beginv
  20859. cabecera " FUNCIONES RELACIONADAS CON INFORMACION GEOGRAFICA "
  20860. color 15 3
  20861. centrar_coordenadas
  20862. borde 2
  20863. ""
  20864. "  El fichero de cabecera ~<locale.h>~ declara funciones  "
  20865. "  que proporcionan información específica de los len-"
  20866. "  guajes y países."
  20867. ""
  20868. endv
  20869. borrar_pantalla
  20870. beginvis
  20871. no_multiatributo
  20872. cabecera " FICHERO DE CABECERA LOCALE.H "
  20873. coordenadas_completas 1 2 80 24
  20874. color 0 3
  20875. borde 2
  20876. " ▄▄▄▄▄▄▄▄▄▄▄▄"
  20877. " ▌localeconv▐   (TC) Devuelve un puntero a la estructura de lugar actual."
  20878. " ▀▀▀▀▀▀▀▀▀▀▀▀"
  20879. ""
  20880. " Sintaxis:"
  20881. "   struct lconv *localeconv (void);"
  20882. ""
  20883. "localeconv pone la moneda específica del país y otros formatos numéricos."
  20884. "Sin embargo, Borland C++ actualmente sólo soporta el lugar C."
  20885. ""
  20886. ""
  20887. " ▄▄▄▄▄▄▄▄▄▄▄"
  20888. " ▌setlocale▐   Selecciona el lugar."
  20889. " ▀▀▀▀▀▀▀▀▀▀▀"
  20890. ""
  20891. " Sintaxis:"
  20892. "   char *setlocale (int categoria, char *lugar);"
  20893. ""
  20894. "La función setlocale() permite al usuario pedir o activar ciertos parámetros"
  20895. "que son sensibles al lugar donde se utiliza el programa. Por ejemplo, en"
  20896. "Europa, la coma se utiliza en lugar del punto decimal; del mismo modo los"
  20897. "formatos de la hora y la fecha difieren."
  20898. ""
  20899. "Si lugar es nulo, setlocale() devuelve un puntero a la actual cadena de"
  20900. "localización. En cualquier otro caso, setlocale() intenta utilizar la ca-"
  20901. "dena de localización especificada para poner los parámetros de lugar según"
  20902. "se especifica en categoria."
  20903. ""
  20904. "En el momento de la llamada, categoria debe de ser una de las siguientes"
  20905. "macros:"
  20906. ""
  20907. "  ■ LC_ALL"
  20908. "  ■ LC_COLLATE"
  20909. "  ■ LC_CTYPE"
  20910. "  ■ LC_MONETARY"
  20911. "  ■ LC_NUMERIC"
  20912. "  ■ LC_TIME"
  20913. ""
  20914. "LC_ALL hace referencia a todas las categorías de localización. LC_COLLATE"
  20915. "afecta a la operación de la función strcoll(). LC_CTYPE modifica la forma"
  20916. "de trabajo de las funciones de caracteres. LC_NUMERIC cambia el carácter"
  20917. "del punto decimal para las funciones de entrada/salida con formato. Final-"
  20918. "mente, LC_TIME determina el comportamiento de la función strftime()."
  20919. ""
  20920. "El estándar define dos posibles cadenas para lugar. La primera es "C", que"
  20921. "especifica el mínimo entorno para la compilación de C. El segundo es " ","
  20922. "la cadena vacía, que especifica el entorno de implementación definido por"
  20923. "defecto. El resto de los valores para locale() están definidos por la im-"
  20924. "plementación y afectan a la portabilidad."
  20925. begint
  20926. ""
  20927. "En Borland C++ (compilador con el que se ha desarrollado este programa),"
  20928. "el único lugar soportado es "C"."
  20929. endt
  20930. ""
  20931. "Ejemplo:"
  20932. ""
  20933. "  #include <locale.h>"
  20934. "  #include <stdio.h>"
  20935. ""
  20936. "  int main (void)"
  20937. "  {"
  20938. "    printf ("Lugar activo actualmente: %s", setlocale (LC_ALL, "C"));"
  20939. ""
  20940. "    return 0;"
  20941. "  }"
  20942. begint
  20943. ""
  20944. ""
  20945. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  20946. "  LCONV (struct)"
  20947. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  20948. ""
  20949. " struct lconv"
  20950. "   {"
  20951. "     char *decimal_point;"
  20952. "     char *thousands_sep;"
  20953. "     char *grouping;"
  20954. "     char *int_curr_symbol;"
  20955. "     char *currency_symbol;"
  20956. "     char *mon_decimal_point;"
  20957. "     char *mon_thousands_sep;"
  20958. "     char *mon_grouping;"
  20959. "     char *positive_sign;"
  20960. "     char *negative_sign;"
  20961. "     char int_frac_digits;"
  20962. "     char frac_digits;"
  20963. "     char p_cs_precedes;"
  20964. "     char p_sep_by_space;"
  20965. "     char n_cs_precedes;"
  20966. "     char n_sep_by_space;"
  20967. "     char p_sign_posn;"
  20968. "     char n_sign_posn;"
  20969. "   };"
  20970. endt
  20971. ""
  20972. endvis
  20973. begint
  20974. partir
  20975. beginv
  20976. cabecera " FUNCION Y ESTRUCTURA DE HORA ACTUAL "
  20977. color 15 3
  20978. centrar_coordenadas
  20979. borde 2
  20980. ""
  20981. "  El fichero de cabecera ~<sys\timeb.h>~ de Turbo C"
  20982. "  declara la función ~ftime()~ y la estructura ~timeb~  "
  20983. "  para obtener la hora actual."
  20984. ""
  20985. endv
  20986. borrar_pantalla
  20987. beginvis
  20988. no_multiatributo
  20989. cabecera " FICHERO DE CABECERA SYS\TIMEB.H (TC) "
  20990. coordenadas_completas 1 2 80 24
  20991. color 0 3
  20992. borde 2
  20993. " ▄▄▄▄▄▄▄"
  20994. " ▌ftime▐   Almacena hora actual en la estructura timeb."
  20995. " ▀▀▀▀▀▀▀"
  20996. ""
  20997. " Sintaxis:"
  20998. "   void ftime (struct timeb *buf);"
  20999. ""
  21000. ""
  21001. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  21002. "  TIMEB (struct)"
  21003. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  21004. ""
  21005. "Información de hora actual rellenada por la función ftime()."
  21006. ""
  21007. "  struct timeb"
  21008. "    {"
  21009. "      long time ; /* segundos desde 1-1-70 hora Greenwitch */"
  21010. "      short millitm ; /* fracción de segundo (en milisegundos) */"
  21011. "      short timezone ; /* diferencia entre hora local y hora Greenwitch */"
  21012. "      short dstflag ; /* 0 si no es horario de verano */"
  21013. "    } ;"
  21014. ""
  21015. endvis
  21016. beginv
  21017. cabecera " FUNCIONES DE INFORMACION DE FICHEROS "
  21018. color 15 3
  21019. centrar_coordenadas
  21020. borde 2
  21021. ""
  21022. "  El fichero de cabecera ~<sys\stat.h>~ de Turbo C declara"
  21023. "  dos funciones que obtienen información de un fichero"
  21024. "  abierto: ~fstat()~ y ~stat()~. Además define la estructura"
  21025. "  ~stat~ que contiene la información sobre los ficheros y"
  21026. "  también define una serie de constantes para identificar  "
  21027. "  el estado de los ficheros."
  21028. ""
  21029. endv
  21030. borrar_pantalla
  21031. beginvis
  21032. no_multiatributo
  21033. cabecera " FICHERO DE CABECERA SYS\STAT.H (TC) "
  21034. coordenadas_completas 1 2 80 24
  21035. color 0 3
  21036. borde 2
  21037. " ▄▄▄▄▄▄▄"
  21038. " ▌fstat▐   Obtiene información del fichero abierto."
  21039. " ▀▀▀▀▀▀▀"
  21040. ""
  21041. " Sintaxis:"
  21042. "   int fstat (int descriptor, struct stat *statbuf);"
  21043. ""
  21044. "Devuelve 0 si tiene éxito; o -1 en caso de error y se pone en errno el"
  21045. "número de error."
  21046. ""
  21047. "  #include <sys\stat.h>"
  21048. "  #include <stdio.h>"
  21049. "  #include <time.h>"
  21050. ""
  21051. "  int main (void)"
  21052. "  {"
  21053. "    struct stat statbuf;"
  21054. "    FILE *stream;"
  21055. ""
  21056. "    if ((stream = fopen ("DUMMY.FIL", "w+")) == NULL)"
  21057. "      {"
  21058. "        fprintf (stderr, "No se puede abrir el fichero.\n");"
  21059. "        return (1);"
  21060. "      }"
  21061. "    fprintf (stream, "Esto es una prueba.");"
  21062. "    fflush (stream);"
  21063. ""
  21064. "    fstat (fileno (stream), &statbuf);"
  21065. "    fclose (stream);"
  21066. ""
  21067. "    if (statbuf.st_mode & S_IFCHR)"
  21068. "      printf ("El descriptor se refiere a un dispositivo.\n");"
  21069. "    if (statbuf.st_mode & S_IFREG)"
  21070. "      printf ("El descriptor se refiere a un fichero ordinario.\n");"
  21071. "    if (statbuf.st_mode & S_IREAD)"
  21072. "      printf ("El usuario tiene permiso de lectura sobre el fichero.\n");"
  21073. "    if (statbuf.st_mode & S_IWRITE)"
  21074. "      printf ("El usuario tiene permiso de escritura sobre el fichero.\n");"
  21075. ""
  21076. "    printf ("Letra de la unidad del fichero: %c\n", 'A'+statbuf.st_dev);"
  21077. "    printf ("Tamaño del fichero en bytes: %ld\n", statbuf.st_size);"
  21078. "    printf ("Hora de la última apertura del fichero: %s\n","
  21079. "            ctime (&statbuf.st_ctime));"
  21080. ""
  21081. "    return 0;"
  21082. "  }"
  21083. ""
  21084. ""
  21085. " ▄▄▄▄▄▄"
  21086. " ▌stat▐   Obtiene información acerca del fichero abierto."
  21087. " ▀▀▀▀▀▀"
  21088. ""
  21089. " Sintaxis:"
  21090. "   int stat (char *path, struct stat *statbuf);"
  21091. ""
  21092. "Devuelve 0 si tiene éxito; o -1 en caso de error y se pone en errno el"
  21093. "número de error."
  21094. ""
  21095. "Ejemplo:"
  21096. ""
  21097. "  #include <sys\stat.h>"
  21098. "  #include <stdio.h>"
  21099. "  #include <time.h>"
  21100. ""
  21101. "  #define NOMBREFICHERO "TEST.$$$""
  21102. ""
  21103. "  int main (void)"
  21104. "  {"
  21105. "    struct stat statbuf;"
  21106. "    FILE *stream;"
  21107. ""
  21108. "    if ((stream = fopen (NOMBREFICHERO, "w+")) == NULL)"
  21109. "      {"
  21110. "        fprintf (stderr, "No se puede abrir el fichero.\n");"
  21111. "        return (1);"
  21112. "      }"
  21113. ""
  21114. "    stat (NOMBREFICHERO, &statbuf);"
  21115. ""
  21116. "    fclose (stream);"
  21117. ""
  21118. "    if (statbuf.st_mode & S_IFCHR)"
  21119. "      printf ("El descriptor se refiere a un dispositivo.\n");"
  21120. "    if (statbuf.st_mode & S_IFREG)"
  21121. "      printf ("El descriptor se refiere a un fichero ordinario.\n");"
  21122. "    if (statbuf.st_mode & S_IREAD)"
  21123. "      printf ("El usuario tiene permiso de lectura sobre el fichero.\n");"
  21124. "    if (statbuf.st_mode & S_IWRITE)"
  21125. "      printf ("El usuario tiene permiso de escritura sobre el fichero.\n");"
  21126. ""
  21127. "    printf ("Letra de la unidad del fichero: %c\n", 'A'+statbuf.st_dev);"
  21128. "    printf ("Tamaño del fichero en bytes: %ld\n", statbuf.st_size);"
  21129. "    printf ("Hora de la última apertura del fichero: %s\n","
  21130. "            ctime (&statbuf.st_ctime));"
  21131. ""
  21132. "    return 0;"
  21133. "  }"
  21134. ""
  21135. ""
  21136. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  21137. "  S_Ixxxx (#defines)"
  21138. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  21139. ""
  21140. "Definiciones usadas por las funciones de directorio y estado de fichero."
  21141. ""
  21142. "  S_IFMT     Máscara de tipo de fichero"
  21143. "  S_IFDIR    Directorio"
  21144. "  S_IFIFO    FIFO especial"
  21145. "  S_IFCHR    Carácter especial"
  21146. "  S_IFBLK    Bloque especial"
  21147. "  S_IFREG    Fichero regular"
  21148. "  S_IREAD    Poseedor puede leer"
  21149. "  S_IWRITE   Poseedor puede escribir"
  21150. "  S_IEXEC    Poseedor puede ejecutar"
  21151. ""
  21152. ""
  21153. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  21154. "  STAT (struct)"
  21155. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  21156. ""
  21157. "Describe una estructura que contiene información acerca de un fichero o"
  21158. "directorio."
  21159. ""
  21160. "  struct stat"
  21161. "    {"
  21162. "      short  st_dev,   st_ino;"
  21163. "      short  st_mode,  st_nlink;"
  21164. "      int    st_uid,   st_gid;"
  21165. "      short  st_rdev;"
  21166. "      long   st_size,  st_atime;"
  21167. "      long   st_mtime, st_ctime;"
  21168. "    };"
  21169. ""
  21170. endvis
  21171. beginv
  21172. cabecera " CONSTANTES SIMBOLICAS PARA COMPATIBILIDAD CON UNIX "
  21173. color 15 3
  21174. centrar_coordenadas
  21175. borde 2
  21176. ""
  21177. "  El fichero de cabecera ~<values.h>~ de Turbo C define  "
  21178. "  constantes compatibles con UNIX para valores límite"
  21179. "  de los tipos float y double."
  21180. ""
  21181. endv
  21182. borrar_pantalla
  21183. beginvis
  21184. no_multiatributo
  21185. cabecera " FICHERO DE CABECERA VALUES.H (TC) "
  21186. coordenadas_completas 1 2 80 24
  21187. color 0 3
  21188. borde 2
  21189. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  21190. "  BITSPERBYTE (#define)"
  21191. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  21192. ""
  21193. "Número de bits en un byte."
  21194. ""
  21195. ""
  21196. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  21197. "  Límites float y double (#defines)"
  21198. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  21199. ""
  21200. " UNIX System V compatible:"
  21201. "════════════╤═════════════════════════════════"
  21202. " _LENBASE   │ Base a la que aplicar exponente"
  21203. ""
  21204. ""
  21205. " Límites para valores float y double"
  21206. "════════════╤══════════════════════════════════════"
  21207. " _DEXPLEN   │ Número de bits en exponente"
  21208. " DMAXEXP    │ Máximo exponente permitido"
  21209. " DMAXPOWTWO │ Potencia de dos más grande permitida"
  21210. " DMINEXP    │ Mínimo exponente permitido"
  21211. " DSIGNIF    │ Número de bits significativos"
  21212. " MAXDOUBLE  │ Valor double más grande"
  21213. " MINDOUBLE  │ Valor double más pequeño"
  21214. ""
  21215. ""
  21216. " Límites para valores float"
  21217. "════════════╤══════════════════════════════════════"
  21218. " _FEXPLEN   │ Número de bits en exponente"
  21219. " FMAXEXP    │ Máximo exponente permitido"
  21220. " FMAXPOWTWO │ Potencia de dos más grande permitida"
  21221. " FMINEXP    │ Mínimo exponente permitido"
  21222. " FSIGNIF    │ Número de bits significativos"
  21223. " MAXFLOAT   │ Valor float más grande"
  21224. " MINFLOAT   │ Valor float más pequeño"
  21225. ""
  21226. endvis
  21227. beginv
  21228. cabecera " FUNCIONES DE COMA FLOTANTE "
  21229. color 15 3
  21230. centrar_coordenadas
  21231. borde 2
  21232. ""
  21233. "  En el fichero de cabecera ~<float.h>~ de Turbo C están"
  21234. "  definidas una serie de funciones relacionadas con el"
  21235. "  coprocesador matemático o con el emulador en su de-"
  21236. "  fecto, esto es, con las operaciones de coma flotante.  "
  21237. ""
  21238. endv
  21239. borrar_pantalla
  21240. beginvis
  21241. no_multiatributo
  21242. cabecera " FICHERO DE CABECERA FLOAT.H (TC) "
  21243. coordenadas_completas 1 2 80 24
  21244. color 0 3
  21245. borde 2
  21246. " ▄▄▄▄▄▄▄▄▄▄"
  21247. " ▌_clear87▐   Borra el estado de coma flotante."
  21248. " ▀▀▀▀▀▀▀▀▀▀"
  21249. ""
  21250. " Sintaxis:"
  21251. "   unsigned int _clear87 (void);"
  21252. ""
  21253. "Los bits del valor devuelto indican el viejo estado de coma flotante."
  21254. "Para obtener información acerca de los estados, ver las constantes definidas"
  21255. "en el fichero de cabecera float.h."
  21256. ""
  21257. "Ejemplo:"
  21258. ""
  21259. "  #include <stdio.h>"
  21260. "  #include <float.h>"
  21261. ""
  21262. "  int main (void)"
  21263. "  {"
  21264. "    float x;"
  21265. "    double y = 1.5e-100;"
  21266. ""
  21267. "    printf ("\nEstado antes del error: %X\n", _status87 ());"
  21268. ""
  21269. "    x = y; /* crea desbordamiento por abajo y pérdida de precisión */"
  21270. "    printf ("Estado después del error: %X\n", _status87 ());"
  21271. ""
  21272. "    _clear87 ();"
  21273. "    printf ("Estado después de borrar el error: %X\n", _status87 ());"
  21274. ""
  21275. "    y = x;"
  21276. ""
  21277. "    return 0;"
  21278. "  }"
  21279. ""
  21280. ""
  21281. " ▄▄▄▄▄▄▄▄▄▄"
  21282. " ▌_fpreset▐   Reinicializa el paquete matemático de coma flotante."
  21283. " ▀▀▀▀▀▀▀▀▀▀"
  21284. ""
  21285. " Sintaxis:"
  21286. "   void  _fpreset (void);"
  21287. ""
  21288. "Esta función se suele usar junto con las funciones de systema exec y spawn"
  21289. "puesto que un proceso hijo podría alterar el estado de coma flotante del"
  21290. "proceso padre."
  21291. ""
  21292. "Ejemplo:"
  21293. ""
  21294. "  #include <stdio.h>"
  21295. "  #include <float.h>"
  21296. "  #include <setjmp.h>"
  21297. "  #include <signal.h>"
  21298. "  #include <process.h>"
  21299. "  #include <conio.h>"
  21300. ""
  21301. "  jmp_buf reentrada;"
  21302. ""
  21303. "  /* define un manejador para atrapar errores de coma flotante */"
  21304. "  void trampa_matematica (int sig)"
  21305. "  {"
  21306. "    printf ("Atrapando error de coma flotante.\n");"
  21307. "    printf ("La señal es: %d\n", sig);"
  21308. "    printf ("Presiona una tecla para continuar.\n");"
  21309. "    getch ();"
  21310. ""
  21311. "    /* reinicializa el chip 8087 o emulador para borrar cualquier error */"
  21312. "    _fpreset ();"
  21313. ""
  21314. "    /* vuelve al lugar del problema */"
  21315. "    longjmp (reentrada, -1);"
  21316. "  }"
  21317. ""
  21318. "  int main (void)"
  21319. "  {"
  21320. "    float uno = 3.14, dos = 0.0;"
  21321. ""
  21322. "    /* instala manejador de señal para las excepciones de coma flotante */"
  21323. "    if (signal (SIGFPE, trampa_matematica) == SIG_ERR)"
  21324. "      {"
  21325. "        printf ("Error al instalar manejador de señal.\n");"
  21326. "        exit (3);"
  21327. "      }"
  21328. ""
  21329. "    printf ("Presiona una tecla para generar un error matemático.\n");"
  21330. "    getch ();"
  21331. ""
  21332. "    if (setjmp (reentrada) == 0)"
  21333. "       uno /= dos;"
  21334. ""
  21335. "    printf ("Volviendo del menajeador de la señal.\n");"
  21336. "    return 0;"
  21337. "  }"
  21338. ""
  21339. ""
  21340. " ▄▄▄▄▄▄▄▄▄▄▄▄"
  21341. " ▌_control87▐   Cambia palabra de control de coma flotante."
  21342. " ▀▀▀▀▀▀▀▀▀▀▀▀"
  21343. ""
  21344. " Sintaxis:"
  21345. "   unsigned int _control87 (unsigned int nuevo, unsigned int mascara);"
  21346. ""
  21347. "Si un bit en la máscara es 1, el correspondiente bit en nuevo contiene el"
  21348. "nuevo valor para el mismo bit en la palabra de control. Si mascara es 0,"
  21349. "la palabra de control no es alterada."
  21350. ""
  21351. ""
  21352. " ▄▄▄▄▄▄▄▄▄▄▄"
  21353. " ▌_status87▐   Obtiene el estado de coma flotante."
  21354. " ▀▀▀▀▀▀▀▀▀▀▀"
  21355. ""
  21356. " Sintaxis:"
  21357. "   unsigned int _status87 (void);"
  21358. ""
  21359. "Los bits del valor devuelto contienen el estado de coma flotante."
  21360. ""
  21361. "Ejemplo:"
  21362. ""
  21363. "  #include <stdio.h>"
  21364. "  #include <float.h>"
  21365. ""
  21366. "  int main (void)"
  21367. "  {"
  21368. "     float x;"
  21369. "     double y = 1.5e-100;"
  21370. ""
  21371. "     printf ("Estado del 87 antes del error: %x\n", _status87 ());"
  21372. ""
  21373. "     x = y;  /* <-- fuerza a que se produzca un error */"
  21374. "     y = x;"
  21375. ""
  21376. "     printf ("Estado del 87 después del error: %x\n", _status87 ());"
  21377. ""
  21378. "     return 0;"
  21379. "  }"
  21380. ""
  21381. ""
  21382. " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
  21383. "  CW_DEFAULT (#define)"
  21384. " ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
  21385. ""
  21386. "Palabra de control por defecto para el comprocesador matemático 8087/80287."
  21387. ""
  21388. endvis
  21389. beginvis
  21390. cabecera " CONEXION DE TURBO C CON ENSAMBLADOR "
  21391. borde 2
  21392. color 14 1
  21393. coordenadas_completas 1 3 80 23
  21394. no_multiatributo
  21395. "El C es un lenguaje muy potente, pero hay veces que puede interesar escribir"
  21396. "algunas intrucciones en ensamblador. Hay tres razones para ello:"
  21397. ""
  21398. "- Aumentar la velocidad y la eficiencia."
  21399. "- Realizar una función específica de la máquina que no está disponible en C."
  21400. "- Utilizar una rutina en lenguaje ensamblador empaquetada de propósito"
  21401. "  general."
  21402. ""
  21403. "Aquí no nos vamos a extender mucho en este tema, sólo nos vamos a limitar a"
  21404. "comentar cómo se pueden incluir instrucciones ensamblador en un programa de"
  21405. "C en el caso de Turbo C."
  21406. ""
  21407. "Antes de escribir instrucciones en ensamblador debemos incluir la siguiente"
  21408. "directiva:"
  21409. ""
  21410. "  ~#pragma inline~"
  21411. ""
  21412. "la cual le dice al compilador que el programa contiene estamentos asm."
  21413. ""
  21414. "La palabra clave asm tiene la siguiente sintaxis:"
  21415. ""
  21416. "  ~asm    codigo_de_operacion    operandos    punto_y_coma_o_nueva_linea~"
  21417. ""
  21418. "Ejemplo:"
  21419. ""
  21420. "  int var = 10;"
  21421. "  asm mov ax, var"
  21422. ""
  21423. "Si se quiere incluir varias instrucciones en ensamblador, se crea un"
  21424. "bloque (con dos llaves) después de asm."
  21425. ""
  21426. "Ejemplo:"
  21427. ""
  21428. "  asm"
  21429. "    {"
  21430. "      pop ax; pop ds"
  21431. "      iret"
  21432. "    }"
  21433. ""
  21434. "Para profundizar más en el tema consulta el manual de usuario de tu"
  21435. "compilador de C."
  21436. ""
  21437. "Ejemplo:"
  21438. ""
  21439. " /*"
  21440. "   Este ejemplo instala una rutina manejadora para la señal SIGFPE,"
  21441. "   atrapa una condición de desbordamiento de entero, hace un reajuste"
  21442. "   del registro AX y vuelve."
  21443. " */"
  21444. ""
  21445. " #pragma inline"
  21446. ""
  21447. " #include <stdio.h>"
  21448. " #include <signal.h>"
  21449. ""
  21450. " #pragma argsused /* para evitar aviso de argumentos sig y tipo no usados */"
  21451. ""
  21452. " void manejador (int sig, int tipo, int *listreg)"
  21453. " {"
  21454. "   printf ("\nInterrupción atrapada.");"
  21455. "   *(listreg + 8) = 3; /* hace devolver AX = 3 */"
  21456. " }"
  21457. ""
  21458. " void main (void)"
  21459. " {"
  21460. "   signal (SIGFPE, manejador);"
  21461. ""
  21462. "   asm mov ax, 07FFFH /* AX = 32767 */"
  21463. "   asm inc ax /* causa desbordamiento (overflow) */"
  21464. "   asm into /* activa manejador */"
  21465. ""
  21466. "   /* El manejador pone AX a 3 a la vuelta. Si no se hubiera incluido en"
  21467. "      el código la línea anterior (instrucción del ensamblador into), se"
  21468. "      activaría el manejador en la instrucción into que han después del"
  21469. "      decremento */"
  21470. ""
  21471. "   asm dec ax /* ahora no se produce desbordamiento (overflow) */"
  21472. "   asm into /* ahora no se activa el manejador */"
  21473. " }"
  21474. ""
  21475. "Otra forma de hacer el ejemplo anterior:"
  21476. ""
  21477. " /*"
  21478. "   Este ejemplo instala una rutina manejadora para la señal SIGFPE,"
  21479. "   atrapa una condición de desbordamiento de entero, hace un reajuste"
  21480. "   del registro AX y vuelve."
  21481. " */"
  21482. ""
  21483. " #include <dos.h> /* para utilizar la pseudovariable _AX */"
  21484. ""
  21485. " #include <stdio.h>"
  21486. " #include <signal.h>"
  21487. ""
  21488. " #pragma argsused /* para evitar aviso de argumentos sig y tipo no usados */"
  21489. ""
  21490. " void manejador (int sig, int tipo, int *listreg)"
  21491. " {"
  21492. "   printf ("\nInterrupción atrapada.");"
  21493. "   *(listreg + 8) = 3; /* hace devolver AX = 3 */"
  21494. " }"
  21495. ""
  21496. " void main (void)"
  21497. " {"
  21498. "   signal (SIGFPE, manejador);"
  21499. ""
  21500. "   _AX = 0x07FFF; /* AX = 32767 */"
  21501. "   _AX++; /* causa desbordamiento (overflow) */"
  21502. "   geninterrupt (4); /* activa manejador */"
  21503. ""
  21504. "   _AX--;"
  21505. "   geninterrupt (4);"
  21506. ""
  21507. "   /* El manejador pone AX a 3 a la vuelta. Si no se hubiera incluido en"
  21508. "      el código la línea anterior (instrucción del ensamblador into), se"
  21509. "      activaría el manejador en la instrucción into que han después del"
  21510. "      decremento */"
  21511. ""
  21512. "   _AX--;"
  21513. "   geninterrupt (4);"
  21514. " }"
  21515. ""
  21516. "Las pseudovariables registros en Turbo C son las siguientes:"
  21517. ""
  21518. "  _AX    _AL    _AH    _SI    _ES"
  21519. "  _BX    _BL    _BH    _DI    _SS"
  21520. "  _CX    _CL    _CH    _BP    _CS"
  21521. "  _DX    _DL    _DH    _SP    _DS"
  21522. "  _FLAGS"
  21523. ""
  21524. "Estas pseudovariables registros corresponden a los registros de los"
  21525. "procesadores 80x86."
  21526. endvis
  21527. endt
  21528. beginv
  21529. color 15 7
  21530. centrar_coordenadas
  21531. no_sombra
  21532. "~                                                           ~"
  21533. "~    f f f f    i i i i    n     n    a a a a    l          ~"
  21534. "~    f             i       n n   n    a     a    l          ~"
  21535. "~    f f f         i       n  n  n    a a a a    l          ~"
  21536. "~    f             i       n   n n    a     a    l          ~"
  21537. "~    f          i i i i    n     n    a     a    l l l l    ~"
  21538. "~                                                           ~"
  21539. "~                                                           ~"
  21540. "~   D E    L A    T E O R I A    D E L    L E N G U A J E   ~"
  21541. "~                                                           ~"
  21542. "~                      ~               ~                      ~"
  21543. "~                      ~   █▀▀▀▀▀▀▀▀   ~                      ~"
  21544. "~                      ~   █           ~                      ~"
  21545. "~                      ~   █   ~                              ~"
  21546. "~                      ~   █   ~                              ~"
  21547. "~                      ~   █           ~                      ~"
  21548. "~                      ~   █▄▄▄▄▄▄▄▄   ~                      ~"
  21549. "~                      ~               ~                      ~"
  21550. "~                                                           ~"
  21551. endv
  21552. end lección 12
  21553.